我有 Django 项目。如果我创建包含 Pool() 对象的包变量,并尝试从 Django View (以并行方式运行)中使用该 Pool,这种方式线程安全吗?还有其他方法吗?
from multiprocessing import Pool
general_executor_pool = Pool()
最佳答案
我在问同样的问题时通过 Google 发现了这个问题。有趣的是,我可以说不,它不是,因为我最近调试了一个存在竞争条件的软件。事情是这样的:
- 一个主进程循环运行,每 3 分钟在一个新线程中生成一个多处理池,其中包含约 1000 个要处理的帐户列表
- 线程调用了 multiprocessing.Pool(max_processes=32), pool.map(func, accounts)。这将打开 32 个流程,并将每个帐户一个接一个地应用到一个可用流程。
- 原作者不知道,这个过程用了 3 分钟多的时间才完成。那么下次生成线程以创建多处理池时会发生什么?它是否产生了 32 个新进程,总共 64 个?不,实际上没有。相反,我的结果被打乱了,并显示多个线程以不确定的方式对我的数据进行操作。
我很乐意跟踪多处理模块,看看它是否在设计上是非线程安全的,或者从知情人士那里得到答案。有趣的是,至少我亲眼目睹了事实并非如此。
关于python - Python多处理池线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40351628/