112

私はドキュメントを読んで検索していますが、まっすぐな答えを見つけることができないようです:

すでに実行中のタスクをキャンセルできますか? (タスクが開始され、しばらく時間がかかり、途中でキャンセルする必要があるため)

Celery FAQのドキュメントからこれを見つけました

>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()

しかし、これがキューに入れられたタスクをキャンセルするのか、ワーカーで実行中のプロセスを強制終了するのかは不明です。あなたが流すことができる光をありがとう!

4

6 に答える 6

209

revokeは、タスクの実行をキャンセルします。タスクが取り消された場合、ワーカーはそのタスクを無視し、実行しません。永続的な取り消しを使用しない場合、ワーカーの再起動後にタスクを実行できます。

http://docs.celeryproject.org/en/latest/userguide/workers.html#worker-persistent-revokes

revoke には、デフォルトでFalseである終了オプションがあります。実行中のタスクを強制終了する必要がある場合は、 terminate をTrueに設定する必要があります。

>>> from celery.task.control import revoke
>>> revoke(task_id, terminate=True)

http://docs.celeryproject.org/en/latest/userguide/workers.html#revoke-revoking-tasks

于 2012-01-19T10:02:45.857 に答える
49

Celery 3.1 では、取り消しタスクの APIが変更されました。

Celery FAQによると、result.revoke を使用する必要があります。

>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()

または、タスク ID しかない場合:

>>> from proj.celery import app
>>> app.control.revoke(task_id)
于 2014-08-29T03:44:43.497 に答える
33

@ 0x00mh の答えは正しいですが、最近のセロリのドキュメントterminateでは、このオプションの使用は「管理者にとって最後の手段」であると述べられています。その間に実行を開始した別のタスクを誤って終了させる可能性があるからです。おそらく、より良い解決策は と組み合わせることですterminate=True(signal='SIGUSR1'これにより、タスクで SoftTimeLimitExceeded 例外が発生します)。

于 2015-04-14T12:38:54.793 に答える
2

タスクの次のオプションを参照してください: time_limitsoft_time_limit (またはワーカーに設定できます)。実行時間だけでなく制御したい場合は、apply_async メソッドの expires 引数を参照してください。

于 2012-01-19T06:40:55.000 に答える