Python多处理: not using separate memory space?

标签 python python-3.x multiprocessing

据我了解,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

最佳答案

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/

相关文章:

Python 多重处理在遵循文档代码时返回 AttributeError

python - 如何禁用 Tkinter 的 Treeview 列的手动调整大小?

python - 向其他QThread发送消息

python - Django Rest Framework 获取表单作为 json

python - 如何将 unicode 转换为 unicode 转义文本

Python 多处理池 OSError : Too many files open

python - 如何将元组解析为多个属性?

python - 使用具有 python 2 和 3 兼容性的 getpass

python-3.x - IndexError : index 43462904 is out of bounds for size 43462904

c++ - 多线程 (openMP) - 有多少并行线程