同时运行两个方法(带参数)?

时间:2014-10-20 20:42:12

标签: python multithreading multiprocessing

我有一个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()

2 个答案:

答案 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()

或者,您始终可以使用lambdapartial构建零参数函数:

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()