4

我正在使用 Python Gevent 的流服务器与另一台发送并发 TCP/IP 请求(平均 60 个请求/秒)的机器(远程)进行通信。这种通信的本质主要是 IO 绑定(短文本,然后是音频流)。我打算使用 Postgresql 来存储每次通信的结果(例如:从远程服务器接收到的文件名)。

我认为为Streamserver中产生的每个greenlet调用一个新的数据库连接是个坏主意(池大小90所以最大90请求/秒,这是我期望的最大值和平均60请求/秒)。是否有可能有可以排队的数据库连接池,并且在开始运行处理程序函数时每个greenlet都从池中获取数据库连接?有没有适用于生产系统的教程?你会怎么建议?我在 Ubuntu 10.04 64 位上使用 gevent 0.13.8 和 postgres 9.1 和 Python 2.7.3。

4

3 回答 3

2

应用程序内池的替代方法是使用PgBouncer. 您仍然有 TCP 连接的开销和一些设置,但比创建一个全新的 PostgreSQL 会话要少得多

与应用内池不同,PgBouncer 可以透明地引入现有系统,作为 PostgreSQL 和池之间的中介。只需将 PostgreSQl 移动到端口 5433 并让 PgBouncer 监听端口 5432。

于 2012-11-03T01:47:14.040 回答
2

Gevent 在示例中包含一个 postgres 数据库池:

https://github.com/gevent/gevent/blob/master/examples/psycopg2_pool.py

于 2012-11-02T18:41:50.850 回答
0

我实际上在这里回答了一个类似的答案:
Python Postgres psycopg2 ThreadedConnectionPool 用尽了

基本上我正在使用 gevent 设置一个异步连接池,通过 postgres 启动一个 Threadpool 连接,并将“绿色”连接状态添加到 postgres。

因此,基本上这会创建一个您指定的预设连接池(例如 100 个),然后使用该池对查询进行排队,因为一个查询返回一个新的查询被处理。我喜欢这种方法比普通的 postgres 池更好,因为请求的异步性质,以及在 Web 框架内实现的容易性。

于 2018-03-23T18:35:44.030 回答