我正在使用Python Gevent的流服务器与另一台发送并发TCP / IP请求的机器(远程)进行通信(平均60 req / sec)。此通信的性质主要是IO绑定(短文本然后是音频流)。我打算使用Postgresql来存储每个通信的结果(例如:从远程服务器收到的文件名)。
我认为为Streamserver中生成的每个greenlet调用一个新的db连接是个坏主意(池大小为90,因此最大值为90 req / sec,即我期望的最大值和平均60 req / sec)。是否可以使数据库连接池可以排队,并且每个greenlet在开始运行处理程序函数时从池中获取数据库连接?有没有适用于生产系统的教程?你会怎么建议?我在Ubuntu 10.04 64bit上使用gevent 0.13.8和postgres 9.1和Python 2.7.3。
答案 0 :(得分:2)
Gevent在示例中包含一个postgres数据库池:
https://github.com/gevent/gevent/blob/master/examples/psycopg2_pool.py
答案 1 :(得分:2)
应用程序内池的替代方法是使用PgBouncer
进行池化。您仍然需要TCP连接和一些设置的开销,但大规模少于创建一个全新的PostgreSQL会话。
与应用程序内池不同,PgBouncer可以作为PostgreSQL和池之间的中介透明地引入现有系统。只需将PostgreSQl移动到端口5433并让PgBouncer侦听端口5432。
答案 2 :(得分:0)
我实际上在这里回答了类似的答案:
Python Postgres psycopg2 ThreadedConnectionPool exhausted
基本上我正在使用gevent设置异步连接池,通过postgres启动Threadpool连接,并将“绿色”连接状态添加到postgres。
所以基本上这会创建一个您指定的预设连接池(如100),然后使用此池对查询进行排队,因为一个查询返回时会处理一个新查询。由于请求的异步性以及在Web框架内实现的简易性,我比普通的postgres池更喜欢这种方法。