python - 如何使用 venv 在 Python 3.7.2 中解决多处理停止工作问题
问题描述
2019-01-12 更新
我重新安装了 Python 3.7.1 并重新制作了 venv 以使一切恢复正常。
但是,我仍然不知道 3.7.2 中发生了什么。
我一直在我的数据处理项目中使用multiprocessing.map_async和 .apply_async。它在 python 3.6 直到 3.7.1 中运行良好,但是当我升级到 3.7.2 并重新创建 venv 时,主进程只是无限期地挂起,子进程根本不工作。
我正在使用Windows10和 PyCharm 社区。
我尝试了 PyCharm 中的工具和“python -m venv”来创建 venv,但都没有成功。我在 python.org 中查找文档并发现
https://docs.python.org/3.7/whatsnew/changelog.html#python-3-7-2-final
它说,
“Windows 上的 venv 现在将使用 python.exe 重定向器,而不是从基本环境中复制实际的二进制文件。”
我想知道这是否导致了问题。
示例代码如下:
from multiprocessing import freeze_support, Pool
def test_func(x):
y = x + 1
return y
if __name__ == '__main__':
freeze_support()
test_data = list(range(10))
with Pool(4) as test_pool:
for test_datum in test_data:
apply_result = test_pool.apply_async(test_func, test_datum)
print(apply_result.get())
我在最后一行添加断点并进入调试模式。然后我发现apply_result对象,它是一个multiprocessing.pool.ApplyResult,有一个_cache属性。在_cache下有相同的multiprocessing.pool.ApplyResult但名称为“ 0 (140716767896368) ”,它也有一个_cache属性,等等。
我绝望了,尝试了可能是最简单的代码(从官方文档修改):
from multiprocessing import Pool, freeze_support
def f(x):
return x*x
if __name__ == '__main__':
freeze_support()
p = Pool(5)
print(p.map(f, [1, 2, 3]))
它仍然挂起。
如果我选择系统解释器,而不是使用 venv,它可以正常工作。
[1, 4, 9]
我真诚地感谢任何帮助解决这个问题。
解决方案
我在 Mac 和 VS Code 上遇到了同样的问题....
所以这是我的解决方案。
import joblib
from joblib import Parallel,delayed
def f(x):
return x*x
number_of_cpu = joblib.cpu_count()
delayed_funcs = [delayed(f)(x) for x in [1,2,3]]
parallel_pool = Parallel(n_jobs=number_of_cpu,prefer="processes")
print(parallel_pool(delayed_funcs))
无论如何,该文档都有很好的记录...
推荐阅读
- python - 将大小为 2 的 numpy 数组转换为 3
- security - 阻止用户使用 AD 组策略上传文件
- python - 如何读取用于训练模型(CNN)的 csv 文件?
- ajax - 如何访问ajax内容中的关系
- python - 如何使用 python imaplib 或其他方式访问我的电子邮件?
- javascript - 如何使用当前 URL 修改 HTML 代码?
- linear-regression - 寻找一个非线性变换矩阵(就像一个有趣的房子镜子)
- database - MariaDB - 10.4.14 Windows 2019 中的静态数据加密
- html - WebStorm Emmet HTML 制作新线
- java - 我想从 web 表中获取带有颜色的文本并使用 selenium web 驱动程序和 apache poi 在 excel 中打印