2023年6月11日日曜日

rqではワーカーに渡す関数はクラスのインスタンスメソッドでもよい

rqではワーカーに渡す関数はクラスのインスタンスメソッドでもよい

概要

エンキューする際に func 引数にインスタンスメソッドが指定可能か試してみました
結論としては指定可能です

環境

  • 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 Message

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

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

scheduler.run()

上記の func=Message("Hello!").say のポイントです
コーラブルであればいいのでインスタンスメソッドでも渡すことができます

ワーカー

  • vim lib/util.py
from datetime import datetime

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

    def say(self):
        msg = f"{self.message}: {datetime.now()}"
        print(msg)
        return msg
  • 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

最後に

これも pickle を使ってシリアライズしているため実現可能になっています
コンストラクタも呼ぶことができるので便利です
あとは引数と組み合わせればいろいろなケースに応じた処理ができるようになるかなと思います

rq の記事はいくつか紹介していますがワーカー側のコードはほぼ変わっていないのでコマンド実行でもいいかもしれません

0 件のコメント:

コメントを投稿