2023年9月5日火曜日

rq-scheduler の enqueue_in を使ってみた

rq-scheduler の enqueue_in を使ってみた

概要

enqueue_in はスケジューラの起点の時間から指定時間後にジョブをスケジューリングする機能です

具体的にどんな動きになるのか試してみました

環境

  • Python 3.11.3
  • flask-rq2 18.3
  • rq-scheduler 0.13.1

サンプルコード

from datetime import timedelta

from flask import Flask
from flask_rq2 import RQ

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

rq = RQ(app)


class User:
    def __init__(self, name) -> None:
        self.name = name

    def say(self, msg):
        print(msg)


@app.route("/register")
def register_job():
    scheduler = rq.get_scheduler(queue="bar")
    job = scheduler.enqueue_in(timedelta(seconds=5), User("hawksnowlog").say, "HELLO")
    return job.get_id()

動作確認

まずはスケジューラを起動します

  • pipenv run rqscheduler
13:40:50 Registering birth

ここの時間が起点時間になります
次にワーカーを起動します

  • pipenv run rq worker bar

あとはアプリを起動しジョブを登録します

  • pipenv run flask run
  • curl localhost:5000/register

するとワーカーのジョブに起点時間から次の 1 分後にログが流れることが確認できると思います

13:41:50 bar: say('HELLO') (0378cd1a-274f-46f7-8484-00d513b98413)
HELLO
13:41:50 bar: Job OK (0378cd1a-274f-46f7-8484-00d513b98413)
13:41:50 Result is kept for 500 seconds

つまり timedelta の最小値は 1min になることがわかります
1min 以下を指定しても結局次の 1 分後にジョブが実行されることになります

最後に

もし秒単位で実行したい場合は少しトリッキーな使い方をする必要があるようです https://github.com/rq/rq-scheduler/issues/74

もしくは素直に rq の機能の enqueue を使う感じかなと思います

また enqueue_in を使った場合は redis 側への結果の保存は 500sec がデフォルトになるのでそのうちキーごと削除されます

参考サイト

0 件のコメント:

コメントを投稿