task_revoked处理程序中的Celery任务ID

时间:2013-03-26 09:07:32

标签: python django celery djcelery

所以我有一个创建工作目录的任务,并在那里完成所有工作。 该任务从服务器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? 有些other Signals拥有它们,我查看了发布这些内容的来源,由于某种原因,这个Signal没有提供task_id。

提供的sender任务包含一个trace_task函数:{'__trace__': <function trace_task at 0x3ee8230>}但我无法看到如何使用它,因为函数本身需要task_id。

欢迎任何其他想法。

1 个答案:

答案 0 :(得分:1)

我认为这里发生的事情是你使用的是较旧版本的芹菜,它不支持这个第一个“请求”参数。

增加这个的上游问题是[1];在此之前,我认为你运气不好,不幸的是没有办法获得task_id。

[1] https://github.com/celery/celery/issues/1555