2023年7月25日火曜日

rqschedulerでワーカーとスケジューラをスクリプトとして定義する方法

rqschedulerでワーカーとスケジューラをスクリプトとして定義する方法

概要

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 を動的に変更したりすることができます

参考サイト

1 件のコメント:

  1. スケジューラとワーカーのコードが逆になっているのでご注意ください

    返信削除