【发布时间】:2017-05-04 20:26:34
【问题描述】:
以下代码启动三个进程,它们在一个池中处理 20 个工作调用:
import multiprocessing
def worker(nr):
print(nr)
numbers = [i for i in range(20)]
if __name__ == '__main__':
multiprocessing.freeze_support()
pool = multiprocessing.Pool(processes=3)
results = pool.map(worker, numbers)
pool.close()
pool.join()
有没有办法按顺序启动进程(而不是让它们同时启动),在每个进程启动之间插入延迟?
如果不使用Pool,我会在循环中使用multiprocessing.Process(target=worker, args=(nr,)).start(),依次启动它们并根据需要插入延迟。不过,我发现Pool 非常有用(与map 通话一起),所以如果可能的话,我很乐意保留它。
【问题讨论】:
-
为什么要这样做?
-
@acushner:举个例子,我有一个需要调用 200 次的 API。 API 的限制是每次调用持续大约 5 分钟(这在调用之间会发生变化)。我可以同时运行 10 个呼叫,并且每个呼叫必须在上一个呼叫结束后至少延迟 5 秒后启动。我可以在我的工作人员开始时添加一个 5 秒的睡眠 - 这在 10 个并行调用同时启动的一开始就可以正常工作。这就是为什么按顺序创建
Pool(延迟 5 秒)可以解决问题的原因。 -
不能编辑我之前的评论,第二句应该是:API的约束是每次调用持续约5分钟(这在调用之间变化),我可以打 10 个电话 (...)。注意逗号而不是句号(有三个约束)
-
你用的是python 2还是python 3?
-
@acushner: python 3.4.3