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

実際に実行されるインスタンスは、遅延メソッドを呼び出すインスタンスと同じではないため、これは機能しません。すべてのワーカーは、タスクごとに独自のシングルトンをインスタンス化します。

つまり、セロリは、タスク オブジェクトがデータを運ぶようには設計されていません。データは、delay または apply_async メソッドを介してタスクに渡す必要があります。コンテキスト オブジェクトが単純でピクルできる場合は、それを遅延に渡すだけです。複雑な場合は、タスクがワーカーでデータベース ID を取得できるように、データベース ID を渡すことをお勧めします。

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

また、セロリ 2.5 では delay と apply_async がクラス メソッドであったことに注意してください。

于 2013-10-06T06:22:49.470 に答える