如何在Python多处理模块中使用Pool.join()?

时间:2017-08-26 09:39:14

标签: python multithreading multiprocessing

以下是代码:

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(),那么代码应该只打印完成'这就是它,因为pool.join()的功能是'等待工作进程退出',但现在没有pool.join(),它得到相同的结果。 我真的不明白。

2 个答案:

答案 0 :(得分:2)

在您的代码中,方法get()join()具有相同的效果。它还等待完成该过程,因为您希望获取结果。

如果从代码中删除它,您将看到首先打印“完成”:

done
start process 0

答案 1 :(得分:1)

res.get等待进程完成(如何获得返回值?)这意味着进程0必须在进程1开始之前完成,依此类推。

删除res.get,您将无法看到流程完成。在第一个循环之后将res.get移动到一个单独的循环中,您将看到它们都在它们完成之前开始。

同时查看Pool.map