概要
rq worker コマンドと rqscheduler コマンドを Python スクリプトとして定義する方法を紹介します
環境
- Python 3.11.3
- rq 1.15.0
- rq-scheduler 0.13.1
ワーカーサンプルコード
rq worker コマンドの代用スクリプトです
- vim ./worker.py
from redis import Redis
from rq.connections import Connection
from rq_scheduler import Scheduler
redis_conn = Redis(host="localhost", port=6379)
scheduler = Scheduler(connection=redis_conn)
if __name__ == "__main__":
with Connection(connection=scheduler.connection):
scheduler.run()
スケジューラサンプルコード
rqscheduler コマンドの代用スクリプトです
- vim ./scheduler.py
from redis import Redis
from rq.queue import Queue
from rq.worker import Worker
redis_conn = Redis(host="localhost", port=6379)
queue = Queue("default", connection=redis_conn)
if __name__ == "__main__":
worker = Worker(queues=[queue], connection=redis)
worker.work(with_scheduler=True)
注意事項
実行する際はワーカー、スケジューラともに PYTHONPATH を設定してあげましょう
- PYTHONPATH=./ pipenv run python ./worker.py
- PYTHONPATH=./ pipenv run python ./scheduler.py
そうしないとジョブを登録するときとスケジューリングするときに実行する関数が見つからず NoModuleNameError になってしまいます
最後に
これで更に Worker や Scheduler クラスを継承することで独自のワーカークラスやスケジューラ実行クラスが作成できます
例えば複数のキューを扱うスケジューラを作成したり接続先の redis を動的に変更したりすることができます
スケジューラとワーカーのコードが逆になっているのでご注意ください
返信削除