我试图端口一些代码在Python 3.6到Python 3.7在Windows 10,我打电话时看到的多处理代码挂.get()在上AsyncResult对象。有问题的代码要复杂得多,但我已将其归结为类似于以下程序的内容。import multiprocessingdef main(num_jobs): num_processes = max(multiprocessing.cpu_count() - 1, 1) pool = multiprocessing.Pool(num_processes) func_args = [] results = [] try: for num in range(num_jobs): args = (1, 2, 3) func_args.append(args) results.append(pool.apply_async(print, args)) for result, args in zip(results, func_args): print('waiting on', args) result.get() finally: pool.terminate() pool.join()if __name__ == '__main__': main(5)此代码也在 Python 2.7 中运行。出于某种原因,第一次调用get()挂起在 3.7 中,但在其他版本上一切正常。
1 回答

米琪卡哇伊
TA贡献1998条经验 获得超6个赞
我觉得这是描述在Python 3.7.2回归这里。它似乎只在 virtualenv 中运行时影响用户。
目前,您可以通过在 bug thread 上执行此评论中描述的操作来解决它。
import _winapi
import multiprocessing.spawn
multiprocessing.spawn.set_executable(_winapi.GetModuleFileName(0))
这将强制子进程使用真正的python.exe 而不是 virtualenv 中的那个。因此,如果您使用 PyInstaller 将东西捆绑到一个 exe 中,这可能不合适,但是从 CLI 运行本地 Python 安装时它可以正常工作。
添加回答
举报
0/150
提交
取消