据我所知,multiprocessing
在Linux上使用fork
,这意味着multiprocessing
创建的每个进程都有自己的内存空间,并且在其中所做的任何更改都不会影响其他fork
ed进程。
但我遇到了一个相当奇怪的情况:
import multiprocessing
i = -1
def change(j):
global i
print(i, end=" ") # should print -1
i = j
with multiprocessing.Pool(20) as p:
p.map(change, range(20))
print(i) # should print -1
我原以为这个程序会精确地打印21
-1
,因为multiprocessing
创建了20个独立的子进程,它们的内存空间是不共享的,这意味着i = j
行不会影响任何其他进程中i
的值;因此在打印时i = -1
。然而,程序实际上打印了
-1
和0到19之间的随机数的混合。例子:
-1 -1 -1 -1 -1 4 -1 5 -1 6 -1 8 -1 -1 14 -1 -1 12 -1 -1 -1
所以我的问题是,为什么我没有得到确切的21
-1
? 最佳答案
Python 3.2引入了maxtasksperchild。
Max TaskExpScript是一个工作者进程可以在退出之前被替换并被一个新的工作者进程替换的任务数,以使未使用的资源被释放。默认的maxtasksperchild为None,这意味着工作进程将与池一样长。
import multiprocessing
i = -1
def change(j):
global i
print(i, end=" ") # should print -1
i = j
if __name__ == '__main__':
with multiprocessing.Pool(20, maxtasksperchild=1) as p:
p.map(change, range(20))
print(i) # should print -1