为什么在需要结果后调用join()进程?

时间:2015-08-06 21:40:12

标签: python process parallel-processing multiprocessor

我看到这个代码发布在某处,并且无法理解它是如何正常工作的:

out_q = Queue()
chunksize = int(math.ceil(len(nums) / float(nprocs)))
procs = []

for i in range(nprocs):
    p = multiprocessing.Process(
            target=worker,
            args=(nums[chunksize * i:chunksize * (i + 1)],
                  out_q))
    procs.append(p)
    p.start()

# Collect all results into a single result dict. We know how many dicts
# with results to expect.
resultdict = {}
for i in range(nprocs):
    resultdict.update(out_q.get())

time.sleep(5)

# Wait for all worker processes to finish
for p in procs:
    p.join()

print resultdict

time.sleep(15)

在我看来,在查询Queue的输出之前等待所有进程终止是有意义的。如何确定在启动所有进程后立即查询队列时,队列将包含所有输出? (即如果工人完成所需的时间相对长于启动所有进程然后开始查看队列所花费的时间,会发生什么情况)

另一个稍微相关的问题:Python文档说"一个进程可以多次连接。"为什么要多次加入该流程?如果它已经终止,那么检查它是否已经再次终止的目的是什么?

1 个答案:

答案 0 :(得分:1)

  

在我看来,等待所有进程是有意义的   在查询队列输出之前终止。

没错,它就是这样的。

  

如何确定在之后立即查询队列   启动所有进程,队列将包含所有输出?

它会等到最后一个进程运行。

  

为什么要多次加入此流程?

有时我们需要多次运行一个进程,比如我们想要使用其他参数或相同参数一次又一次地更新变量,并说我们有很多时间直到“最慢”进程没有完成。