芹菜,redis和ConnectionPool

时间:2016-02-26 14:29:45

标签: python flask redis celery connection-pooling

我最近遇到了芹菜和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创建的数量,那么它是否有点无用?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

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