据我了解,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 .
Maxtasksperchild 是工作进程在退出并被新的工作进程替换以释放未使用的资源之前可以完成的任务数。默认的 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
关于Python多处理: not using separate memory space?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54848720/