首页 > 解决方案 > 如何并行运行带参数的函数?

问题描述

感谢如何并行运行函数?以下代码有效。

import time
from multiprocessing import Process


def worker():
    time.sleep(2)
    print("Working")


def runInParallel(*fns):
    proc = []
    for fn in fns:
        p = Process(target=fn)
        p.start()
        proc.append(p)
    for p in proc:
        p.join()


if __name__ == '__main__':
    start = time.time()
    runInParallel(worker, worker, worker, worker)
    print("Total time taken: ", time.time()-start)

但是,如果我向它添加参数,worker()它就不再并行运行。

import time
from multiprocessing import Process

def worker(ii):
    time.sleep(ii)
    print("Working")

def runInParallel(*fns):
    proc = []
    for fn in fns:
        p = Process(target=fn)
        p.start()
        proc.append(p)
    for p in proc:
        p.join()

if __name__ == '__main__':
    start = time.time()
    runInParallel(worker(2), worker(2), worker(2), worker(2))
    print("Total time taken: ", time.time()-start)

这可能是什么原因?

标签: pythonpython-3.x

解决方案


worker这是因为和之间的差异worker()。第一个是函数,后者是函数调用。在线上发生的事情runInParallel(worker(2), worker(2), worker(2), worker(2))是所有四个调用都在执行runInParallel甚至开始之前运行。如果您print(fns)在开头添加一个,runInParallel您会看到一些不同。

快速解决:

def worker_caller():
    worker(2)

和:

runInParallel(worker_caller, worker_caller, worker_caller, worker_caller)

这不是很方便,但主要是为了说明问题所在。问题不在功能worker上。问题是您混淆了传递函数和传递函数调用。如果您将第一个版本更改为:

runInParallel(worker(), worker(), worker(), worker())

那么你会遇到完全相同的问题。

但是你可以这样做:

runInParallel(lambda:worker(2), lambda: worker(2), lambda: worker(2), lambda: worker(2))

Lambda 非常有用。这是另一个版本:

a = lambda:worker(2)
b = lambda:worker(4)
c = lambda:worker(3)
d = lambda:worker(1)

runInParallel(a, b, c, d)

推荐阅读