芹菜 - 异常重新引发信息



对于芹菜,如果我定义以下任务:

@app.task(bind=True)
def Cmd(self):
self.log.info(f"Running cmd")
with open(f'/tmp/nopermission', 'w') as file:
...

我开始我的芹菜工人,然后从我的 main.py:

res = Cmd.delay()
print(res.get())

在工人日志中,我得到:

Traceback (most recent call last):
...
File "tasks.py", line 5, in Cmd
with open(f'/tmp/nopermission', 'w') as file:
PermissionError: [Errno 13] Permission denied: '/tmp/nopermission'

但是,print(res.get())给了我:

File "site-packages/celery/result.py", line 211, in get
self._maybe_reraise_parent_error()
File "site-packages/celery/result.py", line 234, in _maybe_reraise_parent_error
node.maybe_throw()
File "site-packages/celery/result.py", line 333, in maybe_throw
self.throw(value, self._to_remote_traceback(tb))
File "site-packages/celery/result.py", line 326, in throw
self.on_ready.throw(*args, **kwargs)
File "vine/promises.py", line 244, in throw
reraise(type(exc), exc, tb)
File "vine/five.py", line 195, in reraise
raise value
PermissionError: [Errno 13] Permission denied

基本上,我没有关于确切错误的信息(在本例中为文件名(。为什么?

而且,作为一个更普遍的问题,将额外数据附加到结果的最优雅方法是什么?例如,我在app.conf.workername中具有执行任务的工作线程的名称。我会使用任务基类中的on_failure/on_success处理程序吗?(app = Celery(task_cls='path:baseTask'((

我找到了一种方法来做到这一点,但在这样做的过程中,我想我发现了一个错误。

在启动芹菜时的基任务类中 (Celery(task_cls='path:baseTask')(

class baseTask(Task):    
def on_failure(self, exc, task_id, args, kwargs, einfo):
self.log.error(f'{self.name} on {self.worker} failed after {self.execTime} seconds: {exc}')
self.update_state(state=states.FAILURE, meta={
'exc_type': type(exc).__name__,
'exc_message': traceback.format_exc().split('n'),
'extra': "something"})

然后,运行任何任务:

try:
task.delay()
print(task.get())
except Exception as exc:
time.sleep(2)
info = task.backend.get(res.backend.get_key_for_task(task.id)).decode(encoding='UTF-8')
info = json.loads(info)
print(info['result']['extra'])
raise exc

为什么要睡觉?好吧,如果我不这样做,并继续运行我的 Cmd 任务,那么一半的时间,我不会在"结果"中获得"额外"。这是相当随机的,但睡眠似乎可以解决问题。我很想知道为什么:) 我有芹菜 4.4.2,运输:amqp,结果:redis。

最新更新