我有一个Python脚本,我想同时运行两个方法。我尝试了以下操作,但不幸的是,如果没有参数,线程/进程只会同时运行。那我怎么解决这个问题呢?
from multiprocessing import Process
def download_from_file(filename):
if os.path.exists(filename):
links = [line.strip() for line in open(filename)]
for link in links:
Process(target = standard_download(link)).start()
答案 0 :(得分:1)
您需要args关键字参数:
Process(target = standard_download, args=(link,)).start()
答案 1 :(得分:1)
但不幸的是,如果没有参数,线程/进程只会同时运行。
不,那不是问题。
问题是你正在调用standard_download(link)
,然后将该调用的结果作为target
参数传递。那不是你想要的;您希望将函数本身和参数传递给Process
对象,以便它可以调用它们。这正是args
参数的用途,如most of the examples for multiprocessing
所示。在你的情况下:
Process(target=standard_download, args=(link,)).start()
或者,您始终可以使用lambda
或partial
构建零参数函数:
Process(target=functools.partial(standard_download, link)).start()
作为旁注,只是创建,启动和泄漏一堆子进程是个坏主意。您可能希望将它们全部存储在列表中,然后join
将它们全部存储(无论是立即还是稍后)。例如:
def download_from_file(filename):
if os.path.exists(filename):
links = [line.strip() for line in open(filename)]
for link in links:
p = Process(target=standard_download, args=(link,))
p.start()
yield p
processes = list(download_from_file(filename))
# later, when we need to wait until we're done with all the downloads
for process in processes:
process.join()