概要
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 件のコメント:
コメントを投稿