首页 > 解决方案 > python pool.map_async 不等待 .wait()

问题描述

我正在尝试运行一个与 pool.apply_async 配合得很好的胖函数

现在,我正在尝试 pool.map_async 函数(通过 functools.partial 方法传递了 2 个参数),程序立即完成,没有任何错误或异常......

    files = list_files(mypath) # list of files to process
    csv_rows = None
    result = mp.Queue() #result queue from multiprocessing module

    pool = mp.Pool(4)
    t = pool.map_async( partial(process_file, result), files)
    t.wait() # it doesn't wait HERE ... program exits immediately - no errors

关于我可能遗漏的任何线索?

标签: pythonpython-3.xpython-multiprocessing

解决方案


map_async首先,如果您要立即wait使用它,您可能不需要。如果是这种情况,那么只需使用map. 您也可以删除您的queue并仅返回值。但这可能不是您遇到的问题。

问题很可能是该wait方法不会引发远程异常。很可能您的process_file方法实际上在池进程中失败了,但您没有看到这些异常。就像Blckknght提到的那样,您应该切换到使用一种get方法,正如您在此处看到的,该方法将引发远程异常。这是一个简单的示例,其中该wait方法隐藏了远程进程异常,以及如果切换到get您可以再次看到它们:

import multiprocessing as mp

def just_dies(n):
    raise ValueError("Test")

if __name__ == "__main__":
    pool = mp.Pool(4)
    results = pool.map_async(just_dies, range(10))

    # the wait will immediately silently pass
    #results.wait()

    # this will actually raise the remote exception
    results.get()

如果你运行这个,你会得到一个像这样的回溯错误消息

The above exception was the direct cause of the following exception:
Traceback (most recent call last):
  File "foo.py", line 14, in <module>
    results.get()
  File "XXX/python3.5/multiprocessing/pool.py", line 608, in get
    raise self._value
ValueError: Test

如果您切换到使用该wait方法,那么您将看不到它。


推荐阅读