这是代码:
def function(index):
print('start process '+str(index))
time.sleep(1)
print('end process '+str(index))
return str(index)
if __name__ == '__main__':
pool = Pool(processes=3)
for i in range(4):
res = pool.apply_async(function,args=(i,))
print(res.get())
pool.close()
print('done')
和输出:
start process 0
end process 0
0
start process 1
end process 1
1
start process 2
end process 2
2
start process 3
end process 3
3
done
在我看来,如果我不使用 pool.join((,代码应该只打印"done",仅此而已,因为 pool.join(( 的功能是"等待工作进程退出",但现在没有 pool.join((,它会得到相同的结果。 我真的不明白。
在您的代码中,方法get()
与join()
具有相同的效果。它还等待该过程完成,因为您希望获得它的结果。
如果将其从代码中删除,您将看到首先打印的"完成":
done
start process 0
res.get
等待进程完成(否则它将如何获得返回值?(,这意味着进程 0 必须在进程 1 启动之前完成,依此类推。
删除res.get
,您将看不到进程完成。在第一个循环之后res.get
移动到一个单独的循环,您将看到它们中的任何一个完成之前都开始了。
另请查看Pool.map
.