首页 > 解决方案 > 如何跨 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() 。但我不清楚如何实现这一目标。谢谢

标签: pythonrediscelery

解决方案


我认为您可以使用工作人员信号来实现这一点。

您可能想在worker_init信号中执行此操作。


推荐阅读