0

私はpython 2.7とdjango 1.27を使用しています。タスクにはセロリを使用しています。

私はこのビューを持っています

def my_view(request):
    do_stuff()
    local_1 = 1
    local_2 = 4
    celery_delayed_task(locals())
    return HttpResponse('OK')

これにより、この例外が発生しました

locals() を渡すと失敗します: getstateを定義せずにスロットを定義するクラスはピクルできません

ビューが存在しなくなったときにタスクが呼び出されるため、 locals() 辞書のコピーを作成する必要があると思いました。

私は代わりにこれを試します:

def my_view(request):
    do_stuff()
    local_1 = 1
    local_2 = 4
    locals_dict = copy.deepcopy(locals())
    celery_delayed_task(locals_dict)
    return HttpResponse('OK')

そして今、私はこのエラーを受け取りました:

オブジェクトのディープコピーが失敗しました: object. new (cStringIO.StringO) は安全ではありません。cStringIO.StringO を使用してください。新しい()

明らかに私はそれを間違っています、何か考えはありますか?

4

1 に答える 1

1

タスク引数はシリアル化する必要があります。

CeleryはデフォルトでPythonpickleプロトコルを使用しますが、json、yaml、msgpack、またはカスタムシリアライザーもサポートします。

送信しようとしているオブジェクトをピクルスにすることはできません。それらをピクルスにできる可能性はありますが、最終的には、タスクの引数としてローカルを渡すことは良い習慣ではありません。

参照:http ://docs.python.org/library/pickle.html

于 2012-09-10T15:16:50.333 に答える