2013-03-26 82 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

相關問題