2016-04-25 49 views
0

我試圖去清理一些東西后,我殺了一個正在運行的任務在芹菜。目前,我正在打2個問題:在Celery + Python中,如何從task_revoked函數訪問任務參數?

1)任務吊銷函數體裏面,我怎麼可以訪問該任務調用該函數的參數:因此,例如,如果該任務被定義爲:

@app.task() 
def foo(bar, baz): 
    pass 

我將如何訪問barbaz裏面的task_revoked.connect代碼?

2)我想殺掉一個任務,只有當它的狀態不是X時,這意味着一方面檢查任務,另一方面設置狀態。我猜可以完成狀態檢查,但是我很難在頭腦中圍繞任務函數體內的上下文。

如果我foo定義是這樣的:

@app.task(bound=True) 
def foo(self, bar, baz): 
    pass 

和發言權調用它....瓶像foo(bar, baz),然後我會得到一個錯誤的第三個參數的預期,這意味着做裝飾不通過self參數自動添加任何上下文。

應用提前

回答

1

你可以從請求對象的任務參數表是簡單地定義爲celery.Celery()

感謝。

from celery.signals import task_revoked 

@task_revoked.connect 
def my_task_revoked_handler(sender=None, body=None, *args, **kwargs): 
    print(kwargs['request'].args) 

這將打印給任務的參數。

更新:

你必須使用bindbound

@app.task(bind=True) 
def foo(self, bar, baz): 
+0

的東西是芹菜文檔顯示某種課堂互動的,而是給比其他任何更多的細節:http://docs.celeryproject.org/en/master/userguide/tasks.html#context。如果我試圖在一個類中推送我的函數並調用它們,那麼這個自我不會構成一個狀態參數,這表明裝飾器不會添加任何額外的東西 –

+0

@omu_negru看起來您的代碼中存在拼寫錯誤,檢查更新的答案。 – ChillarAnand

+0

實際上做到了。非常感謝,不會發現那個 –