セロリからタスクを明示的に取り消す必要があります。これは私が現在やっている方法です:-
_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
経由で表示した場合、メッセージはブローカーセクションに残っています。メッセージを削除して、再度使用できないようにする方法を教えてください。
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
これにより、セットがファイルシステムに保存されます。
参照: