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


91

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

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

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

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

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

回答:


179

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

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

取り消しには、デフォルトで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


3
これがまさに私が探していた説明です、ありがとう!
dcoffey3296 2012年

1
これは分散環境で機能しますか?つまり、タスクを実行している複数のマシンにワーカーがいる場合です。セロリは、タスクが実行されているマシンを追跡しますか?
ksrini 2013年

1
します。労働者との通信はブローカーを介して行われます。
2013年

4
result.revoke(terminate = True)は、revoke(task_id、terminate = True)と同じことを行う必要があります
CamHart

9
また、最近のCeleryドキュメントによると、終了オプションの使用は「管理者にとって最後の手段」です。そのワーカーで最近開始された別のタスクを終了するリスクがあります。
kouk

38

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)

25

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


2
このソリューションは私にとって非常にうまくいきました。ときにSoftTimeLimitExceeded私のタスクに上げて、私のカスタムのクリーンアップ・ロジックは、(経由で実装try/ except/ finally呼び出されます)。これは私の見解では、何よりも優れていますAbortableTask提供するもの(docs.celeryproject.org/en/latest/reference/…)います。後者を使用すると、データベース結果のバックエンドを必要手動で繰り返し、それが中止されていますかどうかを確認するために、進行中のタスクの状態を確認する必要があります。
デビッドシュナイダー、

2
これがどのように優れているのか、プロセスによってピックアップされた他のタスクがある場合、それはとにかく停止され、異なる例外がスローされるだけだと私は理解しています。
marxin

worker_prefetch_multiplier = 1いくつかの長い実行中のタスクがあるために使用した場合、終了は問題ありません-終了しても他のタスクは影響を受けないため-これは正しいですか?@spicyramen
maffe


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.