python - 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
关于我可能遗漏的任何线索?
解决方案
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
方法,那么您将看不到它。
推荐阅读
- javascript - 如何将元素拖动到上、下、右、左方向?
- pytorch - torch.nn.functional.gumbel_softmax 的输入
- python - 从 Flask 容器执行主机操作系统命令
- python - python中的日期/时间多行转换问题
- c# - 我应该使用 Nullables 还是结构的唯一值?
- javascript - 打字稿忽略'typeof'运算符
- java - 禁用弹性搜索 Restclient 的 SSL 验证在 Java 中不起作用
- javascript - 如何更改我的正则表达式以匹配多个承诺语法?
- android - 将应用程序包发布到 Playstore 时,用户是否会减少所有不同 abi 版本(如 arm、x86、64)的下载大小?
- assembly - 计算排序数组中重复数字的实例,存储一个计数数组