web-dev-qa-db-ja.com

セロリからタスクを取り消す

セロリからタスクを明示的に取り消す必要があります。これは私が現在やっている方法です:-

_from celery.task.control import revoke

revoke(task_id, terminate=True)
_

ここでtask_idはstring(UUID uuid.UUID(task_id).hex)への変換も試みました。

上記の手順の後、再びセロリを開始すると、_celery worker -A proj_でも同じメッセージが消費され、処理が開始されます。どうして?

flower経由で表示した場合、メッセージはブローカーセクションに残っています。メッセージを削除して、再度使用できないようにする方法を教えてください。

18

revokeはどのように機能しますか?

revokeメソッドを呼び出すと、タスクはすぐにキューから削除されず、セロリ(ブローカーではない!)にtask_idをメモリ内に保存するように指示するだけですset(look here 私のようなソースコードを読むのが好きなら)。

タスクがキューの最上位に到達すると、Celeryはそれが取り消されたセットに含まれているかどうかをチェックし、含まれている場合は実行しません。

これはこのように機能して、各revoke呼び出しのO(n)検索を防止します。ここで、task_idがメモリ内セットにあるかどうかのチェックはO(1)のみです。

セロリを再起動した後、取り消されたタスクが実行されるのはなぜですか?

物事がどのように機能するかを理解すると、setが通常のpythonセットであり、保存されているin-memory-つまり、再起動するとこのセットは失われますが、タスクは(もちろん)永続的であり、タスクが発生すると通常どおり実行されます。

あなたは何ができますか?

永続性を設定する必要があります。これは、ワーカーの初期設定で次のように行われます。

celery worker -A proj --statedb=/var/run/celery/worker.state

これにより、セットがファイルシステムに保存されます。

参照:

29
Or Duan