芹菜任务的属性



当延迟处理任务时,芹菜会清除/无法复制实例变量吗?

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

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

这不起作用,因为实际运行的实例与您调用 delay 方法的实例不同。每个工作线程为每个任务实例化自己的单例。

简而言之,芹菜不是为任务对象携带数据而设计的。数据应通过延迟或apply_async方法传递给任务。如果上下文对象很简单并且可以腌制,只需将其传递给延迟即可。如果它很复杂,更好的方法可能是传递数据库 ID,以便任务可以在辅助角色中检索它。

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

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

相关内容

  • 没有找到相关文章