Celeryで1つのコンテナで定期実行を行う。beatコマンドで定期実行を行う。3.7.4Django==3.0.8celery==4.4.6なお、docker-composeを利用している。コンテナを1つにdockerは1機能1コンテナが基本だが、そうすると、コンテナ1つのサイズがかさんでしまう。具体的にはコンテナ1つ1つにPythonランタイムがあったりするため。(多分)そのため1つのコンテナでsupervisordを使って定期実行を行うことにした。本当は分けた方がいいと思うけどね。容量に余裕がないので仕方なし。proj_rootの親フォルダで操作している。Dockerfileやsupervisord.confなどはここに置いている。ここのフォルダにタスクを設置する。...つまりDjangoアプリのルートフォルダの親フォルダでコンソール操作を行い、celeryはappの下で動かす。定期実行するタスクを用意・動作させるまでここでは定期実行するタスクを用意するところまで記述する。長いがここがわかってないと実装は無理だと思うので書いておく。documentation)を参考にすればいい。Brokerを決めるredisでいいだろう。alpineなdockerイメージもある。celery_network:...といった感じになる。redisはデフォルトでポート番号6379を使用する。redisも必要なので注意。celeryとredisのバンドルもあるようだ。"celery[redis]"これは未確認。celeryこれだけ。これは開発環境用になるので、Dockerで使うときは何らかの方法でインストールする。この環境では開発環境(実際はpipenv)のをコピーするようにしているので、開発環境でインストールすればいい。定義したブローカーのURLをDjangoのsettingsに追記しておく。Djangoの設定はcelery_appインスタンスから読み込むことができる。'redis://redis:6379/0'URLの形式は、:redis://:password@hostname:port/db_numberこのようになっている。documentationより。celery_appとタスクを定義tasks.pyをproj_root/app/celery/に配置する。CELERY_がプレフィックスになっている設定を読み込む。Celeryのブレンドで。DJANGO_SETTINGS_MODULEなどの環境変数の設定は別で行うので不要。開発環境ではVSCodeの.env読み込みが使える。dockerではdocker-compose.ymlで指定できる。@shared_taskも今回は使わない。複数appで同一のcelery_appインスタンスを利用できる模様。タスク定義...のように、django.setup()を事前に行っておけばいい。後から考えれば、celery_app.config_from_object()をmodels.pyのインポート前に行っていれば問題なかったかもしれない。--loglevel=infoをコンソールで行えばいい。場合によっては、--workdirオプションを指定する必要がある。proj_rootが必要。4)のように.delayをコーラブルの前に挟むだけで非同期実行できる。beatコマンドで定期実行を行う。documentationを参考に。CELERY_BROKER_URLと同じようにDjangoのsettingsに追記する。},}あとは、ワーカーと同じように起動しておけばいい。beatワーカーと同じく必要なら--workdirオプションを使う。CELERY_BEAT_SCHEDULEに従って定期実行してくれる。長かったが、ここまでがceleryを使った定期実行の定義・設定になる。以降はここまでで設定したことをもとにdockerの1コンテナで実行する方法を検討実装する。beatこの2つのコマンドで定期実行は行えることがわかる。あとはDjangoを走らせるためにgunicornも使うので、それ用のコマンドを合わせて、同時実行するコマンドは3つとなる。supervisordを使うDockerの1つのコンテナで3つのコマンドを同時に実行するなら、supervisordを使うのがいいだろう。supervisorできる。beatdirectory=proj_root/...--workdirのオプションはdirectoryで指定すればOK。フォルダ構造については、当記事の最初の方で。Dockerfileを書く関係のありそうなところだけ抜粋して書いておく。-dなどで起動すればOK。django-celery-beatもあるceleryのデフォルトスケジューラを、django-celery-beatモジュールのスケジューラに変更するとDjangoのadminサイトでタスクの実行状況を確認できる。documentation確認する頻度はそこまで多くないので、これはとりあえず導入はしないでおく。コンテナを分ける場合おそらく、celeryのワーカー用のコンテナでもコードなどのリソースが必要になるので、Dockerのvolumeを作成し、そこにリソースを入れて、複数のコンテナで共有するのがいいと思う。容量に余裕がないのでこの方法は試していない。実践コンテナ開発入門www.amazon.co.jpDockercelerydjangodockerpython3コピーikapblogikapblog関連記事Python3誕生日被りの確率についてpythonで計算してみる誕生日被りについて調べてみた。二十数人のグループがあると、その中の二人は誕生日が被っていると耳にしたことがあるなと思って、どうなんだろうと調べてみることにした。調べ方は、pythonでの数値計算。コードを書いて、結...雑n個をs個のグループに分割する。割り切れなくなる時は大体等しくする分割についてのメモ。いうのをなんていうか知らない。イベントを明示的に伝播できます、ということです。クラスベースビューのメソッド内でURLのパラメータを使うDjangoのクラスベースビューのメソッド内でURLのパラメータを取る。listviewのメソッド、get_queryset(self)内でURLのパラメータを取得したい。ローカルでは、開発用とテスト用のそれぞれでデータベース...DjangoDjango4のCSRF検証に失敗したというエラーを修正するDjangoによるフォーム入力後の送信にてCSRF検証に失敗したため、リクエストは中断されました。いう403エラーが出る問題を修正。Djangoのメジャーアップデートのため起こっているようだ。Languageでの変数のエスケープ回避ホームDockerikapper主にITなどのアウトプットをしています。ご連絡等はTwitterの@ikapperへ。beatコマンドで定期実行を行う。ikapblog.メニューホーム文字in画像QRIPアドレス確認ホーム検索トップサイドバータイトルとURLをコピーしました。