芹菜任务的属性

时间:2013-10-04 16:42:15

标签: python celery

当延迟处理任务时,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之前已经问过这个问题,但我没有看到答案。

1 个答案:

答案 0 :(得分:3)

这不起作用,因为实际运行的实例与调用延迟方法的实例不同。每个工作人员为每个任务实例化它自己的单例。

简而言之,芹菜不是为任务对象设计的。应通过delay或apply_async方法将数据传递给任务。如果上下文对象很简单并且可以被pickle只是将它传递给延迟。如果它很复杂,更好的方法可能是传递数据库ID,以便任务可以在worker中检索它。

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

另外,请注意,在celery 2.5中,delay和apply_async是类方法。