2013-10-04 162 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是类方法。