私のアプリケーションはPeriodicTask
、ユーザー定義のスケジュールに従ってオブジェクトを作成します。つまり、PeriodicTask のスケジュールはいつでも変更できます。過去数日間、Celery がこれをサポートする方法を見つけようとして、フラストレーションを感じていました。最終的に、何かをPeriodicTask
it として実行するには、最初に作成し、次に登録する必要があるという問題があります (なぜこれが必要なのかわかりません)。
したがって、動的タスクが機能するためには、
- セロリサーバーの起動時にすべてのタスクを登録する
- 新規作成時にタスクを登録します。
#1 は、スタートアップ スクリプト (つまり、./manage.py celerybeat が呼び出された後に実行されるスクリプト) を実行することで簡単に解決できるはずです。残念ながら、これを置くのに便利な場所はないと思います。ある場合、スクリプトは次のようになります。
from djcelery.models import PeriodicTask
from celery.registry import tasks
for task in PeriodicTask.objects.filter(name__startswith = 'scheduler.'):
tasks.register(task)
「スケジューラ」でフィルタリングしています。私のすべての動的タスクの名前がそのように始まるからです。
#2 わからない。私が見た限りの問題は、それがcelery.registry.tasks
メモリに保持されていることであり、コーディングの魔法を除けば、実行が開始された後に celerybeat のタスク レジストリにアクセスする方法はありません。
よろしくお願いします。