Python 如何处理芹菜中的错误';s Task.map

Python 如何处理芹菜中的错误';s Task.map,python,dictionary,exception-handling,celery,Python,Dictionary,Exception Handling,Celery,假设我有两个芹菜任务: @celery.task def run_flakey_things(*args, **kwargs): return run_flakey_and_synchronous_thing.map( xrange(10) ).apply_async() @celery.task def run_flakey_and_synchronous_thing(a): if a % 5: return a raise

假设我有两个芹菜任务:

@celery.task
def run_flakey_things(*args, **kwargs):
    return run_flakey_and_synchronous_thing.map(
        xrange(10)
    ).apply_async()


@celery.task
def run_flakey_and_synchronous_thing(a):
    if a % 5:
        return a
    raise RuntimeError(a)
因此,当您运行
run\u flakey\u things
时,它会立即崩溃,因为序列中的第一项会引发异常。我想要的是像map一样,对序列中的所有项目按顺序运行任务,但继续在异常上运行,在所有这些都完成后引发新的异常


理想的情况是,在应用
xmap
对象之前,我可以向该对象添加一个on_故障,但是
xmap
似乎不是一个完整的任务对象。

我没有使用芹菜。但是,您是否可以向子任务添加
\uuuuuuuuuuuuuuuuuuuuuuu
方法?比如:

class MyTask:
    def __call__(self, *args, **kwargs): 
        try: 
            super(self, MyTask).__call__(*args, **kwargs) 
        except Exception, exc:
            # store exc to be raised later in the main task

@celery.task(base=MyTask):
def run_flakey_and_synchronous_thing(a):
    # ...

然后,对于主
run\u flakey\u things
任务,可以重写
apply\u async()
以检索存储的异常,如中所示。

您可以更改返回值以指示和传播错误。像这样:

import traceback

@celery.task
def run_flakey_things(*args, **kwargs):
    return run_flakey_and_synchronous_thing.map(
        xrange(10)
    ).apply_async()


@celery.task
def run_flakey_and_synchronous_thing(a):
    d = {'value': None, 'error': None}
    try:
        if a % 5:
            d['value'] = a
    except:
        d['error'] = traceback.format_exc()
    return d
然后,您可以做几件事:

1) 将您的run_flakey_things更改为对有错误和无错误的内容进行分组,返回无错误的内容并报告有错误的内容

2) 处理这种行为,不管它叫什么“乱跑”