2013-10-04 161 views
0

當任務被延遲處理時,芹菜清除/無法複製實例變量?芹菜任務的屬性

class MyContext(object): 
    a = 1 


class MyTask(Task): 
    def run(self): 
     print self.context.a 

from tasks import MyTask, MyContext 
c = MyContext() 
t = MyTask() 
t.context = c 
print t.context.a 
#Shows 1 
t.delay() 

=====Worker Output 
Task tasks.MyTask[d30e1c37-d094-4809-9f72-89ff37b81a85] 
raised exception: AttributeError("'NoneType' object has no attribute 'a'",) 

它看起來像這樣here之前已經問過,但我沒有看到一個答案。

回答

3

這不起作用,因爲實際運行的實例與調用延遲方法的實例不同。每個工人爲每個任務實例化它自己的單身人士。

總之,芹菜不是專門爲任務對象攜帶數據而設計的。數據應通過延遲或apply_async方法傳遞給任務。如果上下文對象很簡單並且可以進行pickle,那麼只需傳遞它即可。如果它很複雜,更好的方法可能是傳遞數據庫ID,以便任務可以在worker中檢索它。

http://docs.celeryproject.org/en/latest/userguide/tasks.html#instantiation

而且,請注意,芹菜2.5延遲和apply_async是類方法。