全てのタスクが終わったら、再度1番目から実行できる?

はい、Celeryではタスクが完了した後に新しいタスクをスケジュールすることができます。これを実現するためには、前のタスクが完了したことを監視し、全てのタスクが終了したときに新しいタスクをスケジュールする必要があります。以下はその方法です。

  1. 全てのタスクが完了したかどうかを監視する:
    これは、Celeryのgroupchordなどの結果処理機能を使用して行います。groupは複数のタスクを同時に実行し、全てのタスクの結果を待つことができます。chordは、指定されたタスクが完了した時点で新しいタスクをスケジュールすることができます。

  2. 新しいタスクをスケジュールする:
    全てのタスクが完了した後、新しいタスクをスケジュールします。これにより、最初のタスクから順に再度タスクを実行できます。

以下は、このプロセスを実現するための基本的なコード例です。

python
from celery import group @app.task def crawl_all_apps(): # 全てのアプリケーションをクロールするタスクをグループ化する crawl_group = group( crawl_app.s('APP1'), crawl_app.s('APP2'), crawl_app.s('APP3'), crawl_app.s('APP4'), crawl_app.s('APP5'), crawl_app.s('APP6') ) # グループ化されたタスクを実行する result = crawl_group.apply_async() # グループ化されたタスクが完了した後に新しいタスクをスケジュールするコールバックを登録する result.then(schedule_next_task.s()) @app.task def schedule_next_task(): # 新しいタスクをスケジュールする crawl_all_apps.apply_async(countdown=60) # 60秒後に新しいタスクをスケジュールする

この設定により、crawl_all_apps()タスクが呼び出されると、全てのクローラータスクがグループ化され、並行して実行されます。全てのタスクが完了した後、schedule_next_task()タスクが呼び出され、60秒後に再度crawl_all_apps()タスクがスケジュールされます。これにより、最初のタスクから順にクローラータスクが定期的に実行されます。

未分類

Posted by ぼっち