2023年6月10日土曜日

rqではワーカーに渡す変数情報はクラスのオブジェクトでも良い

rqではワーカーに渡す変数情報はクラスのオブジェクトでも良い

概要

エンキューする際にシリアライザを内部的にコールしておりデフォルトのシリアライザが pikle を使っているためオブジェクトでもワーカーに渡すことができます

環境

  • macOS 11.7.6
  • Python 3.10.2
    • rq 1.15.0
    • rq-scheduler 0.13.1

エンキュー

  • vim app.py
from redis import Redis
from rq import Queue
from rq_scheduler import Scheduler
from lib.util import say, Message

queue = Queue('bar', connection=Redis())
scheduler = Scheduler(queue=queue, connection=queue.connection)

scheduler.cron(
    "*/1 * * * *",
    func=say,
    args=[Message("Hello!")],
)


scheduler.run()

上記の args=[Message("Hello!")], のポイントです
string や integer の値ではなく Message クラスのオブジェクトを渡すことができます

ワーカー

  • vim lib/util.py
from datetime import datetime

class Message():
    def __init__(self, message: str):
        self.message = message


def say(msg: Message):
    print(msg.message)
    return f"{msg.message}: {datetime.now()}"
  • 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 app.py
  • pipenv run python worker.py

最後に

デフォルトのシリアライザを拡張して独自のシリアライザを指定することも可能です

0 件のコメント:

コメントを投稿