对于芹菜,如果我定义以下任务:
@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')
)时在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。