python - 如何跨 celery 任务共享 redis 连接池?
问题描述
我有以下设置,其中每个任务必须每 10 秒访问一次 Redis 数据库。我想在它们之间共享连接池,以实现更高的效率。
芹菜.py
from celery import Celery
app = Celery("notify", include=["notify.tasks"])
app.config_from_object("notify.celery_config")
app.conf.beat_schedule = {
"run-push-every-10-seconds": {"task": "notify.tasks.push", "schedule": 10.0}
}
任务.py
import os
import redis
from notify.celery import app
from config import get_settings
settings = get_settings()
redis_pool = None
def init():
global redis_pool
print("PID %d: initializing redis pool..." % os.getpid())
redis_pool = redis.ConnectionPool(
host=settings.REDIS_IP,
password=settings.REDIS_PASSWORD,
port=settings.REDIS_PORT,
db=settings.REDIS_DB,
)
@app.task
def push():
r = redis.Redis(
connection_pool=redis_pool,
decode_responses=True,
)
print(r.keys("*"))
我做了一些研究,建议全局创建 ConnectionPool 并在与 Redis 建立连接时注入它,就像我在上面所做的那样init()
。
我想我必须在初始化进程或工作人员时调用一次 init() 。但我不清楚如何实现这一目标。谢谢
解决方案
我认为您可以使用工作人员信号来实现这一点。
您可能想在worker_init信号中执行此操作。
推荐阅读
- c# - C# TransactionScope 可以与 SSH.NET 一起使用吗?
- javascript - 如何解析json响应ajax
- c# - 微服务并按顺序处理收到的消息
- machine-learning - Sagemaker XG-Boost (objective=reg:logistic) 不适用于高度不平衡的数据集
- list - Flutter:`notifyListeners`不更新列表
- excel - excel中是否有一个选项可以根据第一个文档自动填充其他第二个文档?
- angular - 对于 Angular ngIf 异步/可观察状态更改错误,今天没有好的答案
- python - 是否可以复制本网站的 AJAX 调用?(网络抓取问题)
- r - tidyr complete() 是否使用 dplyr group_by() 函数?
- wordpress - apache/wordpress 更改域时,资产仍使用旧域 url