Noé*_*ieu 11 python connection-pooling redis celery flask
我最近遇到了芹菜和redis的问题:我使用了太多的连接到我的cloud redis帐户.
我似乎已经通过更好的设置和更大的redis计划解决了这个问题.
然而,它引导我对redis和芹菜如何协同工作进行了一些实验,并且有一些我不理解的东西:ConnectionPoolPython redis模块创建的redis数量.
我配置芹菜使用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
}
Run Code Online (Sandbox Code Playgroud)
我用以下命令运行芹菜:
celery worker --without-gossip --without-mingle --without-heartbeat --concurrency=1 --app=backZest.celery
在Celery启动后,我已经10连接到我的redis实例:这是正常的吗?
我检查了redis ConnectionPool创建了多少:要做到这一点,我只是修改了python redis模块connection.py文件,在类的__init__方法中ConnectionPool:
import sys
print "ConnectionPool instance %s with %s max_connections" % (id(self), self.max_connections)
sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)
如您所见,创建了许多(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
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会有这么多.我想控制我的redis的连接数.我可以控制每个max_connections的数量,ConnectionPool但如果我不控制ConnectionPool创建的数量,它是否有点无用?
非常感谢你的帮助 !
是的,这是正常的。池预先创建连接,以便在您需要时它们已准备好。建立连接可能需要花费大量时间,因此池可以帮助您节省时间。用于max_connections根据需要限制池。并且不用担心池会提前打开连接。