所以我有一个任务,创建一个工作目录,并在那里做所有的工作。任务从服务器A调用,并在工作服务器上执行。
我需要确保一旦任务完成就删除工作目录/取消。
我添加了一个任务撤销处理程序,它看起来像这样:
@task
def my_task(value):
task_id = current_task.request.id
work_dir = os.path.join(BASE_WORK_DIR, task_id)
os.makedirs(work_dir)
try:
# Do work...
finally:
shutil.rmtree(work_dir)
@task_revoked.connect(sender=my_task)
def my_task_revoked_handler(*args, **kwargs):
# FIXME: delete work_dir
print args
# ()
print kwargs
# {'terminated': True, 'signal': <Signal: Signal>, 'expired': False, 'sender': <@task: myapp.core.tasks.my_task>, 'signum': '15'}
我的问题是当服务器A取消任务时,我不能在被撤销的处理程序中发出工作目录的清理,因为它没有task_id。
是否有任何方法从这个特定的信号处理程序获得任务id ?其他一些信号有它们,我已经查看了发出这些信号的源,由于某种原因,这个信号没有提供task_id。
提供的sender
任务包含一个trace_task函数:{'__trace__': <function trace_task at 0x3ee8230>}
,但我不能看到我如何使用它,因为函数本身需要一个task_id。
我认为这里发生的事情是您使用的是旧版本的芹菜,不支持第一个"请求"参数。
添加this的上游问题是[1];在此之前,我认为你运气不好,不幸的是没有办法得到task_id。
[1] https://github.com/celery/celery/issues/1555