Celery、Redis 和 ConnectionPool

Posted

技术标签:

【中文标题】Celery、Redis 和 ConnectionPool【英文标题】:Celery, Redis and ConnectionPool 【发布时间】:2016-06-09 19:42:59 【问题描述】:

我最近在使用 Celery 和 Redis 时遇到了问题:我使用了太多连接到我的云 Redis 帐户的连接。

我现在似乎已经通过更好的设置和更大的 Redis 计划解决了这个问题。

但是,它让我对 Redis 和 Celery 如何协同工作进行了一些实验,并且有一些我不明白的地方:由 Python Redis 模块创建的 Redis ConnectionPool 的数量。

我将 Celery 配置为使用 Redis 作为代理和结果后端。

这是我的 Celery 配置:

CELERY_TIMEZONE = 'Europe/Paris'
CELERY_BROKER_URL = REDIS_URL
CELERY_RESULT_BACKEND = REDIS_URL
CELERY_TASK_SERIALIZER = 'pickle'
CELERY_SEND_EVENTS = False
CELERY_IMPORTS = ('task1', 'task2')
CELERY_ACCEPT_CONTENT = ['pickle']
CELERY_REDIS_MAX_CONNECTIONS = 2
BROKER_POOL_LIMIT = 1
BROKER_HEARTBEAT = None
BROKER_TRANSPORT_OPTIONS = 
   'max_connections': 30

我使用以下命令运行 C​​elery:

celery worker --without-gossip --without-mingle --without-heartbeat --concurrency=1 --app=backZest.celery

在 Celery 启动后,我已经有 10 连接到我的 Redis 实例:这正常吗?

我检查了创建了多少redisConnectionPool:为此,我只是在ConnectionPool 类的__init__ 方法中修改了Python Redis 模块connection.py 文件:

import sys
print "ConnectionPool instance %s with %s max_connections" % (id(self), self.max_connections)
sys.stdout.flush()

如您所见,创建了许多 (8) 个池,它们都具有相同的 max_connections,30,这是我在 BROKER_TRANSPORT_OPTIONS 中的设置:

ConnectionPool instance 4412957392 with 30 max_connections
ConnectionPool instance 4412959888 with 30 max_connections
ConnectionPool instance 4420369616 with 30 max_connections
ConnectionPool instance 4420370320 with 30 max_connections
ConnectionPool instance 4420367056 with 30 max_connections
ConnectionPool instance 4420491792 with 30 max_connections
ConnectionPool instance 4422318224 with 30 max_connections
ConnectionPool instance 4422319504 with 30 max_connections

我不明白为什么会有这么多。我想控制与我的 Redis 的连接数。我可以控制每个ConnectionPool 的max_connections 数量,但如果我不控制ConnectionPool 创建的数量,它不是有点没用吗?

非常感谢您的帮助!

【问题讨论】:

如果我没记错的话,每当你实例化 Redis 类时,它都会创建一个新的 ConnectionPool (!) 所以最好(如果可以的话)重用同一个实例......也许是新的 Python redis客户不再这样做了...... 【参考方案1】:

是的,这很正常。 Pool 会预先创建连接,以便在您需要它们时准备好它们。建立连接可能需要很长时间,因此 pool 可以帮助您节省时间。使用max_connections 根据需要限制池。不要担心池会提前打开连接。

【讨论】:

以上是关于Celery、Redis 和 ConnectionPool的主要内容,如果未能解决你的问题,请参考以下文章

Celery 队列和 Redis 队列

使用 Heroku 安装 Celery 和 Redis

Celery 和 Redis 不断耗尽内存

在 Heroku 上挂载 Celery 时出现“[Errno 111] Connection denied”错误

celery结合redis 使用

基于celery及redis封装sanic的api