2023年6月9日金曜日

Flask-RQ2を試す

Flask-RQ2を試す

概要

前回 rq-scheduler を使って見ました
今回は Flask の拡張である Flask-RQ2 を使って rq-scheduler と組み合わせてみました

環境

  • macOS 11.7.6
  • Python 3.10.2
    • rq 1.15.0
    • rq-scheduler 0.13.1
    • flask 2.3.2
    • flask-rq2 18.3

流れ

  1. Flask アプリでリクエストを受け取りジョブを登録
  2. スケジューラの実行
  3. ワーカーの実行

という流れになります
つまり起動するプロセスも 3 つ必要になります

Flask アプリ: ジョブを登録する

  • vim app.py
from flask import Flask, request
from flask_rq2 import RQ
from lib.util import Message

app = Flask(__name__)
app.config['RQ_REDIS_URL'] = 'redis://localhost:6379/0'

rq = RQ(app)


@app.route("/")
def register_job():
    username = request.args.get('username', "default_user")
    # get_scheduler は rq-scheduler のオブジェクトが変えるので cron が使える
    scheduler = rq.get_scheduler(queue='bar')
    job = scheduler.cron(
        "*/1 * * * *",
        func=Message(f"{username}").say,
        args=[],
    )
    print(job)
    return f"<p>{job.get_id()}</p>"
  • vim lib/util.py
from datetime import datetime

class Message():
    def __init__(self, message: str):
        self.message = message

    def say(self):
        msg = f"{self.message}: {datetime.now()}"
        print(msg)
        return msg

以下で起動しておきます

  • pipenv run flask run

スケジューラの起動

スケジューラは登録されたジョブの内容に応じて実際にキューにジョブを登録しワーカーにジョブを渡す役割になります

今回は特にスケジューラはカスタムしないのでコマンドラインで起動します (カスタムする場合は python スクリプトを作成してそれを起動します)

  • pipenv run flask rq scheduler

flask-rq2 をインストールすると flask 経由でスケジューラを起動できるようになります

ワーカーの起動

最後にワーカーを起動しましょう
これもコマンドで起動できますがせっかくなのでスクリプトにしました

  • vim worker.py
from rq import Worker, Queue
from redis import Redis

redis = Redis()
queue = Queue('bar', connection=redis)


if __name__ == "__main__":
    worker = Worker(queues=[queue], connection=redis)
    worker.work(with_scheduler=True)

起動は

  • pipenv run python worker.py

で OK です

動作確認

  • curl localhost:5000

と実行するとジョブが登録されます
そしてスケジューラが登録されたジョブのルールーに沿ってキューにジョブを登録します

あとはワーカーのログにジョブが実行されているログが流れれば OK です

最後に

Flask-RQ2 を使ってみました

組み合わせて使わなくても OK ですが組み合わせることで特殊なデコレータが使えたり Flask の設定ファイルの管理と同じにしたりすることができます
また Queue や Worker などのモジュールも Flask 経由で取得できるようになります

参考サイト

0 件のコメント:

コメントを投稿