タスクキューイングができるCeleryを使っているけど、一部認証が1時間で切れる箇所があり、期限切れの前に定期的に再認証を行う処理が必要になった。
そのため、Celeryでcron的なことができるbeat機能を使った。
Periodic Tasks
Periodic Tasks — Celery 4.0.2 documentation
ドキュメントから下記部分を参考に再認証処理を追加
from celery import Celery from celery.schedules import crontab app = Celery() @app.on_after_configure.connect def setup_periodic_tasks(sender, **kwargs): # Calls test('hello') every 10 seconds. sender.add_periodic_task(10.0, test.s('hello'), name='add every 10') # Calls test('world') every 30 seconds sender.add_periodic_task(30.0, test.s('world'), expires=10) # Executes every Monday morning at 7:30 a.m. sender.add_periodic_task( crontab(hour=7, minute=30, day_of_week=1), test.s('Happy Mondays!'), ) @app.task def test(arg): print(arg) Setting these up from w
最初はworkerの他にbeatの起動が必要なのを知らずに、全然動かんと思ってしまった。
しかし、今回の再認証処理は、同一インスタンス内で再認証するので、別プロセス、別コンテナ(Docker)になってしまうと、全く意味がない。
なんとか一プロセスでworkerとbeatを起動できないかと思ってたら簡単にできるよう。
python manage.py celery worker --beat
※--beatの代わりに-Bでも同じ
が、ドキュメントを見てみると
Periodic Tasks — Celery 4.0.2 documentation
this is convenient if you’ll never run more than one worker node, but it’s not commonly used and for that reason isn’t recommended for production use:
あまり一般的ではなく、本番環境ではおすすめしないとのこと。
Worker内で行う再認証などは、素直にWorker内で完結させたほうが良さそう。
Celery、リトライ、時間制限(1秒に1回だけとか)、cronのような定期実行までできて便利すぎてやばい。