2012-03-16 17 views
3

セロリ(より具体的にはジャンゴ・セロリ)を使い始めたばかりで、まだ私はそれに精通していません。セロリでイベントをキャプチャする方法

私は、各タスクが完了するのに約3分かかり、作業者が遠隔で実行されるタスクを送信するアプリケーションを開発しています。 (重い処理ではなく、ウェブクロールのものですが、それは無関係です)。

タスクを送信すると、結果を取得するための参照が取得されます。

>>> result = task_name.delay() 
>>> result 
<AsyncResult: c34d78d8-b512-4165-9384-2b87933e33b7> 

しかし、タスクが完了したときを知るために、私はポーリングを避けるために、

>>> result.ready() 
False 
に私の考えをポーリングを維持する必要があり、 task-succeeded/task-failedイベントをリッスンすることです。 返されたことが分かったら、データベースをチェックせずに処理を続行するか、準備ができているかどうかを継続的に確認します。 (誰かがタスクの完了を確認するためのより良い提案がある場合は、私が聞きたいのですが)

私には明らかな問題があるかどうかは分かりませんが、どうしたらいいですか?

Celery Events docsでは、カスタムカメラを使用する必要があります。 これは別の問題です。私はdjango-cellelのDjango Admin Monitorを使用しようとしています。

最後に、 カメラなしでイベントをキャプチャできますか?どうやって? そうでなければ、django-celeryのカメラで使用できますか?

+0

あなたの質問は解決しましたか、まだ回答がありませんか?更新を行います。 – Aman

答えて

2

Taskon_successと他のハンドラの問題は、ワーカーで実行されます。この方法を使用する場合は、そのメソッドに追加するコードが目的のアクションをトリガーする必要があります。タスクはそれを呼び出すプロセスについての情報を持っていないので、あなたはおそらく別のタスクを実行するでしょう...呼び出し元に何らかの方法で...キューが実行されるのを待つでしょう...あなたが探しているもの。

タスクレベルのイベントの非同期通知を取得するには、http://docs.celeryproject.org/en/latest/userguide/monitoring.html?highlight=my_monitor#id20に示すようにCelery.events.Stateを使用します。監視するイベントを選択し、イベントが発生したときにリアルタイム通知(コールバックスタイル)を取得できます。

0

セロリのドキュメントは現時点では解決されていませんが、タスクが完了したことをリモートタスクが呼び出せるコールバックメソッドを設定できるように思えます。解決するためにセロリのドキュメントを入手できる場合は、この回答を更新します。

編集:今すぐドキュメントを参照してください。

だからthe documentationには、on_successまたはafter_returnハンドラのいずれかのタスククラスが必要です。ユースケースに応じて、このメソッドはタスクの戻り値を使用して行う必要のある処理を行うことも、結果が成功したことを通知することもできます。私はワーカーの代わりにハンドラを実行する必要がある場合を除き、前者をお勧めします。いずれにしても、result.ready()をもう一度ポーリングする必要はありません。

+0

実際には、ハンドラの処理を行う必要があります。 'after_return()'を試しましたが、これはワーカー側で実行されます。 'on_success()'を試してみましょう。 – alfetopito

+0

私は 'after_return'がハンドラで呼び出されると思いますので、必要な機能が得られるはずです。タスクを開始した場所と同じコンテキスト(ブロック)にする必要がある場合は、おそらくa)ポーリングを行う必要があるか、b)実際に同期サブタスクとしてこれを実行し、ブロックを作成する必要があるかもしれませんハンドラで実行するように設計された新しいタスクとして。 – mklauber

+0

カメラを読み上げるのは、タスクの環境全体(キューのサイズ、すべてのタスクのステータスなど)を監視するためのもので、個々のタスク自体を監視するものではありません。 – mklauber

関連する問題