当前位置: 首页 > 面试题库 >

多处理AsyncResult.get()在Python 3.7.2中挂起,但在3.6中挂起

松涵容
2023-03-14
问题内容

我正在尝试将一些代码从Python 3.6移植到Windows 10上的Python
3.7。我看到在调用.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中挂起,但是在其他版本上一切正常。


问题答案:

我觉得这是描述在Python
3.7.2回归这里。它似乎仅在virtualenv中运行时影响用户。

目前,您可以通过执行此错误线程注释中所述的方法来解决此问题。

import _winapi
import multiprocessing.spawn
multiprocessing.spawn.set_executable(_winapi.GetModuleFileName(0))

这将迫使子进程使用 真正的
python.exe而不是virtualenv中的子进程生成。因此,如果您使用PyInstaller将内容捆绑到exe中,则可能不合适,但是当使用本地Python安装从CLI运行时,它可以正常工作。



 类似资料:
  • 我甚至不能使用Python 2.7中运行的多重处理包(使用spyder作为窗口上的用户界面)进行并行处理的最简单的例子,我需要帮助解决这个问题。我已经运行了conda更新,所以所有的包都应该是最新的和兼容的。 即使多处理软件包文档(如下所示)中的第一个示例也不起作用,它会生成4个新进程,但控制台只是挂起。在过去的3天里,我已经尝试了我能找到的一切,但是没有一个不挂起就运行的代码能够将我25%以上的

  • 我正在处理200万记录和网格大小为20的Spring批处理应用程序。对于100200k记录,它工作正常,但200万分区后失败。 分区信息: 它打印的最后一个日志是创建的分区,然后控件永远不会进入writer。对于20万条记录来说,它很困难,所以我增加了连接池的大小,这解决了这个问题,但在200万行中失败了。 没有错误,只是挂在那里。

  • 我试图运行与Python。这样做可以解析来自多个源的RSS提要。问题是它在处理一些链接后挂在其中一个线程中。如果我删除池并在循环中运行,整个流程就会工作。 这是我的多处理代码: 这是在中调用的代码: 我不知道它为什么会挂起来。code中是否有错误?

  • 我试图理解为什么这段代码返回“Promise{pending}”。 当我通过reduceDirections()函数时,我可以看到我得到了想要的结果。但是当我(一行之后)时,我会改为“Promise pending” 很抱歉,我不理解promise和异步等待。我曾尝试在mdn上阅读和观看视频,但我不知道如何将它们显示的内容转移到这个问题上。提前感谢您的帮助!

  • 我正在尝试构建一个类,该类使用多处理请求来并行发出多个请求。我遇到一个问题,它只是挂起,并给我一个神秘的错误消息,我不确定的方式。 下面是我的代码,它基本上只是使用一个带回调的池将结果放入列表。我有一个要求,我需要一个"硬超时"为每个URL,即,如果一个URL需要几秒钟以上的下载其内容,我只是想跳过它。所以我使用池超时,并对尝试的URL和返回的URL内容进行了比较,尝试但未返回的URL被认为失败了