概要
エンキューする際に 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 件のコメント:
コメントを投稿