当延迟处理任务时,celery是否清除/无法复制实例变量?
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之前已经问过这个问题,但我没有看到答案。
答案 0 :(得分:3)
这不起作用,因为实际运行的实例与调用延迟方法的实例不同。每个工作人员为每个任务实例化它自己的单例。
简而言之,芹菜不是为任务对象设计的。应通过delay或apply_async方法将数据传递给任务。如果上下文对象很简单并且可以被pickle只是将它传递给延迟。如果它很复杂,更好的方法可能是传递数据库ID,以便任务可以在worker中检索它。
http://docs.celeryproject.org/en/latest/userguide/tasks.html#instantiation
另外,请注意,在celery 2.5中,delay和apply_async是类方法。