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) 处理这种行为,不管它叫什么“乱跑”