3

バックエンド タスクを実行するために Django+Celery+RabbitMQ の実装を開始しました。サンプルの add(x, y) タスクから始めて、それが機能していることを確認してから、既存のユーティリティ メソッドを Celery タスク モジュールに配置しました。問題は、タスクを呼び出すと正常に実行されますが、クライアントが結果を取得できないことです。

>>> r = SyncUsers.delay()
>>> r.get()
... Hangs here forever
^C
... (Stack trace omitted)
KeyboardInterrupt
>>> r.successful()
False

Celeryd ログ:

[2012-11-01 11:15:23,442: INFO/MainProcess] Task celerytasks.tasks.SyncUsers[9e8f4da3-17d2-4944-9095-51de1afcaaf3] succeeded in 34.596668005s: <website.bullhorn.api.APIResult object at...

ここで何が起こっているか知っている人はいますか?

編集: get() を呼び出すと、次のように表示されることに気付きました:

....\lib\site-packages\djcelery\managers.py:183: TxIsolationWarning: 同じトランザクション内でトランザクション分離レベルが反復可能読み取りで結果をポーリングすると、古い結果が得られる場合があります。ポーリングの反復ごとに必ずトランザクションをコミットしてください。「トランザクション分離レベルでのポーリング結果」

そしてそれはまだ永遠に待っています。

4

1 に答える 1

3

そして、答えがありました。MySQL を使用しているため、トランザクション分離レベルを READ-COMMITTED に設定する必要がありました

http://dev.mysql.com/doc/refman/5.1/en/set-transaction.html

また、私を正しい方向に向けてくれたhttp://www.no-ack.org/2010/07/mysql-transactions-and-django.htmlにも功績があります。(ブログは現在、公開を停止しているようです)

于 2012-11-01T12:50:51.020 に答える