web-dev-qa-db-ja.com

Celeryで既に実行中のタスクをキャンセルしますか?

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

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

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

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

しかし、これがキューに入れられたタスクをキャンセルするのか、それともワーカーで実行中のプロセスを強制終了するのかはわかりません。当てることができる光をありがとう!

83
dcoffey3296

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

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

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

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

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

153
mher

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)
32
Rockallite

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

21
kouk

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

1
simplylizz

さらに、不十分で、タスクを停止する別の方法(タスクの中止)がありますが、多くの信頼性がなく、詳細があります: http://docs.celeryproject.org/en/latest/reference/celery .contrib.abortable.html

0
xiaopo