python - 如何并行运行带参数的函数?
问题描述
感谢如何并行运行函数?以下代码有效。
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)
这可能是什么原因?
解决方案
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)
推荐阅读
- maven - Maven 编译器错误 - 无效标志 - 发布
- c# - How to retry a NUnit TestCase?
- laravel - Laravel, relationship problems
- javascript - Implementing Ecwid on a Angular 8 Application with script tags
- servlets - 无法初始化类 com.kaltura.client.Client
- r - 库(venn),更改字体大小
- c# - Owned types collection is never updated in EF Core
- sql - Date problem with sql - displaying only one row
- python - 当我使用最小最大缩放数据训练模型时,如何使用最小最大缩放器预测单个数据样本?
- javascript - 在动画中使用画布目的地输出在 chrome 和 firefox 中不起作用