9

PeriodicTaskをサブクラス化することで、django-celeryで定期的なタスクを機能させることができました。テストタスクを作成して、役に立たないことを実行するように設定しようとしました。できます。

今、私はそれを止めることはできません。ドキュメントを読みましたが、実行キューからタスクを削除する方法がわかりません。celeryctlとシェルを使用してみましたが、registry.tasks()が空であるため、削除する方法がわかりません。

「取り消す」という提案を見てきましたが、そのためにはタスクIDが必要なようで、タスクIDを見つける方法がわかりません。

ありがとう。

4

2 に答える 2

21

タスクはメッセージであり、「定期的なタスク」は定期的な間隔でタスクメッセージを送信します。送信される各タスクには、一意のIDが割り当てられます。

revoke1つのタスクメッセージのみをキャンセルします。タスクのIDを取得するには、送信されたIDを追跡する必要がありますが、タスクを送信するときにカスタムIDを指定することもできます。

1つのタスクメッセージをキャンセルするのか、それとも定期的なタスクがそれ以上メッセージを送信しないようにするのかわからないので、両方の回答をリストします。

定期的なタスクで送信されるタスクのIDを保持する組み込みの方法はありませんが、各タスクのIDを定期的なタスクの名前に設定できます。これにより、IDは定期的なタスクで送信されるすべてのタスクを参照します。 (通常は最後のもの)。この方法でカスタムIDを指定できます。

@periodic_taskデコレータのいずれか:

@periodic_task(options={"task_id": "my_periodic_task"})
def my_periodic_task():
    pass

またはCELERYBEAT_SCHEDULE設定で:

CELERYBEAT_SCHEDULE = {name: {"task": task_name,
                              "options": {"task_id": name}}}

定期的なタスクを削除する場合は@periodic_task、コードベースからを削除するか、からエントリを削除しCELERYBEAT_SCHEDULEます。Djangoデータベーススケジューラを使用している場合は、Django管理インターフェースから定期的なタスクを削除する必要があります。

PS1:revokeすでに開始されているタスクを停止しません。まだ開始されていないタスクのみをキャンセルします。を使用して、実行中のタスクを終了できます revoke(task_id, terminate=True)。デフォルトでは、これはTERM信号をプロセスに送信します。別の信号(KILLなど)を送信する場合は、を使用します revoke(task_id, terminate=True, signal="KILL")

PS2:revokeはリモートコントロールコマンドであるため、RabbitMQおよびRedisブローカートランスポートでのみサポートされます。タスクでキャンセルをサポートする場合はcancelled 、データベースにフラグを保存し、開始時にタスクにそのフラグをチェックさせる必要があります。

from celery.task import Task

class RevokeableTask(Task):
    """Task that can be revoked.

    Example usage:

        @task(base=RevokeableTask)
        def mytask():
            pass
    """

    def __call__(self, *args, **kwargs):
        if revoke_flag_set_in_db_for(self.request.id):
            return
        super(RevokeableTask, self).__call__(*args, **kwargs)
于 2011-11-22T18:23:07.730 に答える
6

これが誰かを助けるかもしれない場合に備えて...私たちは仕事で同じ問題を抱えていました、そして定期的なタスクを削除するためのある種の管理コマンドを見つけるためのいくつかの努力にもかかわらず、私たちはできませんでした。だからここにいくつかのポインタがあります。

おそらく、最初に使用しているスケジューラークラスを再確認する必要があります。

デフォルトのスケジューラーはですcelery.beat.PersistentScheduler。これは、ローカルデータベースファイル(シェルフ)の最後の実行時間を追跡するだけです。

私たちの場合、djcelery.schedulers.DatabaseSchedulerクラスを使用していました。

django-celeryスケジュールをDjangoデータベースに保存するスケジューラーも付属しています

ドキュメントには定期的なタスクを削除する方法が記載されていますが、次のようになります。

のスケジューラを使用django-celeryして、Django Adminから定期的なタスクを追加、変更、および削除できます。

プログラムで、またはシェルの(セロリ/管理)コマンドを介して削除を実行したかったのです。

コマンドラインが見つからなかったため、django/pythonシェルを使用しました。

$ python manage.py shell
>>> from djcelery.models import PeriodicTask
>>> pt = PeriodicTask.objects.get(name='the_task_name')
>>> pt.delete()

これがお役に立てば幸いです。

于 2015-10-09T21:56:10.567 に答える