【问题标题】:How to handle all errors from Python multiple pools?如何处理来自 Python 多个池的所有错误?
【发布时间】: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 具有returnmy_pool.map 将保留该结果。所以你只需要阅读pool_function的结果作为我下面的答案。如果你需要full traceback,你可以返回traceback.format_exc()而不是MyError

标签: python python-2.7 multiprocessing


【解决方案1】:

您必须将try~ except 放入您的pool_function 而不是__main__。如果不是,__main__ 将在第一个之后停止,除非被提升,并且没有机会让第二个运行。这是您正在尝试的内容:

def pool_function(msg):
    print msg
    try:
        raise MyError(msg)
    except:
        return MyError(msg)


def some_function():
    my_pool = Pool(2)
    msg = ['first', 'second']

    return my_pool.map(pool_function, msg)

if __name__ == '__main__':
    try:
       msg= some_function()
    except MyError, msg:
        print msg

它有效,但似乎不是一个好方法,所以:

def pool_function(msg):
    print msg
    try:
        # do something
        raise MyError(msg)
    except:
        return 0,MyError(msg)
    else:
        return 1,# some result

def some_function():
    my_pool = Pool(2)
    msg = ['first', 'second']
    return return my_pool.map(pool_function, msg)

if __name__ == '__main__':
    msg = some_function()
    for result in msg:
        if result[0]:
            # do something when it run successfully
        elif not result[0]:
            print result[1]
            # do something when it got errors

【讨论】:

    猜你喜欢
    • 2016-08-12
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2020-08-14
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多