我最近遇到了芹菜和redis的问题:我使用了太多的连接到我的cloud redis帐户。
我似乎已经通过更好的设置和更大的redis计划解决了这个问题。
然而,它引导我对redis和芹菜如何协同工作进行了一些实验,并且有一些我不理解的东西:由redis模块创建的redis ConnectionPool
的数量。
我将celery配置为使用redis作为经纪人和结果后端。
这是我的芹菜配置:
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 worker --without-gossip --without-mingle --without-heartbeat --concurrency=1 --app=backZest.celery
Celery启动后,我已经与我的redis实例建立了10
个连接:这是正常的吗?
我检查了创建了多少redis
ConnectionPool
:要执行此操作,我只是在connection.py
__init__
方法中修改了python redis模块ConnectionPool
文件。 1}} class:
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
创建的数量,那么它是否有点无用?
非常感谢你的帮助!
答案 0 :(得分:0)
是的,这很正常。池预先创建连接,以便在您需要时准备就绪。建立连接可能需要很长时间,因此池可以帮助您节省成本。使用max_connections
可根据需要限制池。并且不要担心池会提前打开连接。