2013-03-26 32 views
1

所以我有一个任务创建一个工作目录并在那里完成所有工作。 该任务从服务器A调用,并在工作服务器上执行。task_revoked handler中的Celery任务ID

我需要确保任务完成后删除工作目录/ 取消

我添加了一个任务,撤销的处理程序,它看起来像这样:

@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有他们,我已经看过这些发布的来源,由于某种原因,这个信号没有提供给task_id。

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

欢迎任何其他想法。

回答

1

我想这里发生了什么是你正在使用一个老版本的芹菜,不支持这个第一个“请求”的论点。

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

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

+0

晚比从来没有好过我猜=) – JayLev 2013-11-22 08:51:54

相关问题