Celery-异常重新引发信息

问题描述 投票:0回答:1

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

@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'))

python exception celery raise
1个回答
0
投票

我找到了一种方法,但是这样做,我想我发现了一个错误。

在启动芹菜(Celery(task_cls='path:baseTask'))时在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。

© www.soinside.com 2019 - 2024. All rights reserved.