如何使用venv解决Python 3.7.2中的多进程停止工作问题

如何使用venv解决Python 3.7.2中的多进程停止工作问题,python,python-3.x,multiprocessing,Python,Python 3.x,Multiprocessing,2019-01-12更新 我重新安装了Python3.7.1,并重新制作了venv,以使一切恢复正常 但是,我仍然不知道3.7.2中发生了什么 我一直在数据处理项目中使用多处理.map\u async和.apply\u async。直到3.7.1,它在Python3.6中运行良好,但当我升级到3.7.2并重新创建venv时,主进程只是无限期地挂起,子进程根本不工作 我正在使用Windows10和PyCharm社区 我尝试了PyCharm内部的工具和“python-m venv”来创建venv,

2019-01-12更新

我重新安装了Python3.7.1,并重新制作了venv,以使一切恢复正常

但是,我仍然不知道3.7.2中发生了什么


我一直在数据处理项目中使用多处理.map\u async和.apply\u async。直到3.7.1,它在Python3.6中运行良好,但当我升级到3.7.2并重新创建venv时,主进程只是无限期地挂起,子进程根本不工作

我正在使用Windows10和PyCharm社区

我尝试了PyCharm内部的工具和“python-m venv”来创建venv,但两者都不起作用。 我在python.org中查找文档,发现

上面说,

“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\u result对象是一个多处理.pool.ApplyResult对象,它有一个\u cache属性。在\u cache下有相同的多处理.pool.ApplyResult,但名称为“0(140716767896368)”,该名称还具有\u cache属性,等等

我绝望地尝试了可能最简单的代码(从官方文档修改):

它静止不动

如果我选择的是系统解释器,而不是使用venv,那么它可以正常工作

[1, 4, 9]

我衷心感谢您对解决此问题的任何帮助。

我在Mac和VS代码上也遇到了同样的问题

这就是我的解决方案

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 3.6,除非您需要使用最新版本中的新函数。可能尝试使用
--copies
选项创建venv(例如
python-m venv-copies
)@SPYBUG96 Yes,因为我需要新的数据类功能,所以恢复到3.7.1就可以了。不过如果我能修复这个bug还是更好的。@SPYBUG96谢谢你的帮助suggestion@Scratch我试过了,但遗憾的是没有成功。无论如何,谢谢你。
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))