概要
前回 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
流れ
- Flask アプリでリクエストを受け取りジョブを登録
- スケジューラの実行
- ワーカーの実行
という流れになります
つまり起動するプロセスも 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 件のコメント:
コメントを投稿