psycopg 文档状态:“Psycopg 连接不是绿色线程安全的,并且不能由不同的绿色线程同时使用。尝试使用每个线程一个游标一次执行多个命令将导致错误(或版本上的死锁) 2.4.2 之前)。因此,建议程序员要么避免在协程之间共享连接,要么使用库友好的锁来同步共享连接,例如用于池。
我找不到绿色线程安全的池实现 - 那里有吗?
psycopg 文档状态:“Psycopg 连接不是绿色线程安全的,并且不能由不同的绿色线程同时使用。尝试使用每个线程一个游标一次执行多个命令将导致错误(或版本上的死锁) 2.4.2 之前)。因此,建议程序员要么避免在协程之间共享连接,要么使用库友好的锁来同步共享连接,例如用于池。
我找不到绿色线程安全的池实现 - 那里有吗?
我假设你知道gevent-psycopg2模块,它使psycopg
greenlet 友好。
寻找连接池解决方案我尝试了 2 个解决方案:
SQLALchemy
- 它似乎与猴子补丁线程和gevent-psycopg2
. 该类在内部QueuePool
使用threading
模块进行锁定,因此需要进行猴子修补,即使gevent-psycopg2
是psycopg2
绿色的。
示例中有一个psycopg2
连接池gevent
示例
我已经尝试了这两种解决方案,但不是在生产负载下 - 所以我还不能说它们的稳健性。
如果你打电话gevent.monkey.patch_thread()
,你应该可以使用psycopg2.pool.ThreadedConnectionPool
.
这是一个很好的池(不仅仅是示例,而是在生产中使用):psycopg2_pool.py