概要
エンキューする際にシリアライザを内部的にコールしておりデフォルトのシリアライザが 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 件のコメント:
コメントを投稿