【发布时间】:2015-01-26 13:18:29
【问题描述】:
为了演示问题,我准备了简单的代码:
from multiprocessing import Pool
class MyError(Exception):
def __str__(self):
return repr("Error msg: " + self.args[0])
def pool_function(msg):
print msg
raise MyError(msg)
return 0
def some_function():
my_pool = Pool(2)
msg = ['first', 'second']
my_pool.map(pool_function, msg)
if __name__ == '__main__':
try:
some_function()
except MyError, msg:
print msg
在这个特定的示例中,我得到以下输出:
first
second
'Error msg: first'
但我需要:
first
second
'Error msg: first'
'Error msg: second'
问题是在主函数级别我尝试访问所有唯一的错误消息,而不是在 pool_function 级别处理它,但我只得到第一个错误消息。不幸的是,我使用的真实代码要复杂得多,因此很难用示例中演示的代码结构做一些事情。我需要一些干净直接的解决方案来获取所有错误消息并在主函数级别进行处理。
感谢任何解决方案的建议。
【问题讨论】:
-
try~except将在第一次引发异常时停止您的程序,因此第二个 msg 将没有机会运行。相反,您应该将try~except放在pool_function中,并在引发异常时返回错误消息,如果成功则返回结果。 -
@dragon2fly 你应该这样回答。
-
@dragon2fly 是的,在这种情况下,我可以显示消息,但如果我想获取此信息并进一步处理它,那么我宁愿从该函数返回它以在 main 中处理它。但是,正如我在示例中所示,该结构是多级的。我的问题是关于某些语言构造解决方案的可能性,在这种情况下,我不应该担心如何将其转移到主要功能。
-
如果
pool_function具有return,my_pool.map将保留该结果。所以你只需要阅读pool_function的结果作为我下面的答案。如果你需要full traceback,你可以返回traceback.format_exc()而不是MyError
标签: python python-2.7 multiprocessing