web-dev-qa-db-ja.com

Celeryタスクの実行を延期するにはどうすればよいですか?

処理のためにタスクをキューに入れる小さなスクリプトがあります。このスクリプトは、キューに入れる必要のあるアイテムを取得するために、大量のデータベースクエリを実行します。私が直面している問題は、セロリワーカーが、スクリプトによってキューに入れられるとすぐにタスクを取得し始めることです。これは正しく、セロリが機能するはずの方法ですが、これはしばしば私のスクリプトとセロリワーカーの間のデッドロックにつながります。

スクリプトからすべてのタスクをキューに入れても、スクリプトが完了するまで、または一定の時間遅延まで実行を遅らせる方法はありますか?

セロリやDjango-celeryのドキュメントでこれを見つけることができませんでした。これは可能ですか?

現在、クイックフィックスとして、処理するすべてのアイテムをリストに追加することを考えていました。スクリプトですべてのクエリの実行が完了したら、リストを繰り返し処理してタスクをキューに入れることができます。これで問題が解決するかもしれませんが、キューに入れるアイテムが何千もある場合、これは悪い考えかもしれません。

15

eta/countdownオプションを使用すると、タスクの実行を遅らせることができます。

http://docs.celeryproject.org/en/master/userguide/calling.html#eta-and-countdown

15
mher

タスクの実行を遅らせる方法を要求するのではなく、独自のスクリプトの競合状態を回避しようとしていると思います。

次に、タスクを作成し、そのタスクで、.apply_async()や.delay()ではなく.apply()を使用して各タスクを呼び出します。これらのタスクが順番に実行されるように

1
Yefei