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'",)

看起来这个问题在这里之前已经被问过,但我没有看到答案。

4

1 回答 1

4

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

简而言之,celery 并不是为承载数据的任务对象而设计的。数据应该通过 delay 或 apply_async 方法传递给任务。如果上下文对象很简单并且可以腌制,只需将其传递给延迟。如果它很复杂,更好的方法可能是传递一个数据库 id,以便任务可以在 worker 中检索它。

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

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

于 2013-10-06T06:22:49.470 回答