【发布时间】:2019-02-24 04:24:22
【问题描述】:
据我了解,multiprocessing 在 Linux 上使用fork,这意味着multiprocessing 创建的每个进程都有自己的内存空间,并且在其中所做的任何更改都不会影响其他forked 进程。
但是我遇到了这种比较奇怪的情况:
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?
【问题讨论】:
-
虽然你使用
Pool(20),但它不会真正创建20个进程,直到需要它。这意味着某些任务可能在同一个进程中执行。您可以打印出os.getpid()进行检查。
标签: python python-3.x multiprocessing