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

Python,多处理:process.join()做什么?,python,parallel-processing,multiprocessing,python-multiprocessing,Python,Parallel Processing,Multiprocessing,Python Multiprocessing,我试着运行这个代码,这是我得到的输出 import time from multiprocessing import Process def loop(limit): for i in xrange(limit): pass print i limit = 100000000 #100 million start = time.time() for i in xrange(5): p = Process(target=loop, args=

我试着运行这个代码,这是我得到的输出

import time
from multiprocessing import Process

def loop(limit):
    for i in xrange(limit):
        pass
    print i

limit = 100000000 #100 million

start = time.time()    

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

end = time.time()
print end - start
有时

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


我还对
p.join()
语句的作用感到困惑。它是结束任何一个过程还是同时结束所有过程?

您的工作方式存在一些问题,请尝试以下方法:

99999999
99999999
3.72434902191
99999999
99999999
99999999
99999999
99999999
问题是您没有跟踪单个进程(循环中的p变量)。你需要让他们留在身边,这样你才能与他们互动。此更新将使它们保留在数组中,然后在最后加入所有这些元素

输出如下所示:

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]
请注意,现在运行所需的时间也会在执行结束时打印出来


另外,我运行了您的代码,无法多次执行循环。

连接函数当前将等待您调用的最后一个进程完成,然后再转到下一段代码。如果您仔细查看您所做的工作,您应该会明白为什么会得到“奇怪”的输出

这将依次启动5个新流程。这些都是同时运行的。至少,由调度器决定当前正在处理的进程

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

过程1

过程2

过程3

过程4

过程5

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

现在让我们假设进程2首先完成,然后是进程5,这是完全可行的,因为调度器可以在CPU上给这些进程更多的时间

过程1

过程2打印9999999

过程3

过程4

过程5打印9999999

p.join()
行现在将转到下一部分,因为
p
过程5已经完成

p.join()
本节将打印其部分,在输出之后,现在仍有3个过程在进行

其他进程在那里完成并打印9999999

要修复此行为,您需要
.join()
所有进程。为此,您可以将您的代码更改为

end = time.time()
print end - start

这将等待第一个进程,然后是第二个进程,依此类推。一个进程是否在另一个进程之前完成并不重要,因为在脚本继续之前,列表中的每个进程都必须等待。

join
不会结束任何事情。它只是一个同步点。这意味着“我将在这里等待,直到所有的进程都完成,然后我们将继续执行”。无论何时结束,他们都会以任何顺序结束。但为什么有时会运行7次呢?
p.join()
end = time.time()
print end - start
processes = []

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

for process in processes:
    process.join()