Python,多处理:process.join()做什么?

时间:2015-07-13 14:50:14

标签: python parallel-processing multiprocessing python-multiprocessing

99999999
99999999
2.73401999474
99999999
99999999
99999999

我尝试运行此代码,这是我得到的输出

99999999
99999999
3.72434902191
99999999
99999999
99999999
99999999
99999999

有时候

p.join()

在这种情况下,循环函数被调用7次而不是5次。为什么会出现这种奇怪的行为?

我也对>> ind = [2 3]; 声明的作用感到困惑。是同时结束任何一个过程还是所有过程?

2 个答案:

答案 0 :(得分:3)

join函数当前将等待您调用的最后一个进程完成,然后再转到下一段代码。如果你走过你已经完成的事情,你应该明白为什么你会得到'#34;奇怪的"输出

for i in xrange(5):
    p = Process(target=loop, args=(limit,))
    p.start()

这将一个接一个地启动5个新进程。这些都在同一时间运行。 至少,至少要由调度程序决定当前正在处理的进程。

这意味着您现在有5个进程在运行:

  

流程1

     

流程2

     

流程3

     

过程4

     

过程5

p.join()

这将等待p流程完成流程5 ,因为这是分配给p的最后一个流程。

现在让我们说进程2 先完成后跟进程5 ,这完全可行,因为调度程序可以让这些进程在CPU上有更多时间。

  

流程1

     

处理2 打印99999999

     

流程3

     

过程4

     

处理5 打印99999999

p.join()行现在将转移到下一部分p 流程5 已完成。

end = time.time()
print end - start

此部分打印其部分,现在此输出后仍有3个进程。

其他进程完成并打印99999999。

要解决此问题,您需要.join()所有进程。为此,您可以将代码更改为此...

processes = []

for i in xrange(5):
    p = Process(target=loop, args=(limit,))
    p.start()
    processes.append(p)

for process in processes:
    process.join()

这将等待第一个进程,然后是第二个进程,依此类推。如果一个进程在另一个进程之前完成,那将无关紧要,因为在脚本继续之前必须等待列表中的每个进程。

答案 1 :(得分:2)

你做事的方式有些问题,试试这个:

start = time.time()    
procs = []
for i in xrange(5):
    p = Process(target=loop, args=(limit,))
    p.start()
    procs.append(p)
[p.join() for p in procs]

问题在于您没有跟踪单个进程(循环内的p变量)。你需要保留它们,以便与它们进行交互。此更新将使它们保留在数组中,然后在最后加入所有这些更新。

输出如下:

99999999
99999999
99999999
99999999
99999999
6.29328012466

请注意,现在运行所花费的时间也会在执行结束时打印出来。

另外,我运行了你的代码并且无法让循环执行多次。