Multiprocessing AsyncResult.get() 在 Python 3.7.2

我试图端口一些代码在Python 3.6到Python 3.7在Windows 10,我打电话时看到的多处理代码挂.get()在上AsyncResult对象。有问题的代码要复杂得多,但我已将其归结为类似于以下程序的内容。


import multiprocessing



def 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 中,但在其他版本上一切正常。


人到中年有点甜
浏览 204回答 1
1回答

米琪卡哇伊

我觉得这是描述在Python 3.7.2回归这里。它似乎只在 virtualenv 中运行时影响用户。目前,您可以通过在 bug thread 上执行此评论中描述的操作来解决它。import _winapiimport multiprocessing.spawnmultiprocessing.spawn.set_executable(_winapi.GetModuleFileName(0))这将强制子进程使用真正的python.exe 而不是 virtualenv 中的那个。因此,如果您使用 PyInstaller 将东西捆绑到一个 exe 中,这可能不合适,但是从 CLI 运行本地 Python 安装时它可以正常工作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python