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
我使用以下命令运行 Celery:
celery worker --without-gossip --without-mingle --without-heartbeat --concurrency=1 --app=backZest.celery
在 Celery 启动后,我已经有 10
连接到我的 Redis 实例:这正常吗?
我检查了创建了多少redis
ConnectionPool
:为此,我只是在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的主要内容,如果未能解决你的问题,请参考以下文章