17

psycopg 文档状态:“Psycopg 连接不是绿色线程安全的,并且不能由不同的绿色线程同时使用。尝试使用每个线程一个游标一次执行多个命令将导致错误(或版本上的死锁) 2.4.2 之前)。因此,建议程序员要么避免在协程之间共享连接,要么使用库友好的锁来同步共享连接,例如用于池。

我找不到绿色线程安全的池实现 - 那里有吗?

4

3 回答 3

16

我假设你知道gevent-psycopg2模块,它使psycopggreenlet 友好。

寻找连接池解决方案我尝试了 2 个解决方案:

  • SQLALchemy- 它似乎与猴子补丁线程和gevent-psycopg2. 该类在内部QueuePool使用threading模块进行锁定,因此需要进行猴子修补,即使gevent-psycopg2psycopg2绿色的。

  • 示例中有一个psycopg2 连接池gevent示例

我已经尝试了这两种解决方案,但不是在生产负载下 - 所以我还不能说它们的稳健性。

于 2012-09-29T07:44:12.717 回答
4

如果你打电话gevent.monkey.patch_thread(),你应该可以使用psycopg2.pool.ThreadedConnectionPool.

于 2012-09-29T10:18:19.163 回答
0

这是一个很好的池(不仅仅是示例,而是在生产中使用):psycopg2_pool.py

于 2012-09-29T07:39:55.620 回答