我正在使用 psycopg2,我的应用程序中有多个绿色线程。每个线程使用
psycopg2.connect
获取连接。有时我会收到以下错误:
error: Second simultaneous read on fileno 14 detected. Unless you really know what you're doing,
make sure that only one greenthread can read any particular socket. Consider using a pools.Pool.
If you do know what you're doing and want to disable this error, call
eventlet.debug.hub_prevent_multiple_readers(False) - MY THREAD=<built-in method switch of
GreenThread object at 0x7fbf6aafc048>; THAT THREAD=FdListener('read', 14,
<built-in method switch of greenlet.greenlet object at 0x7fbf6aafc470>,
<built-in method throw of greenlet.greenlet object at 0x7fbf6aafc470>)
据我所知,我没有在这个项目中配置连接池。 (
grep -ri pool .;
什么都不返回。)
psycopg2.connect
是否在某种隐式连接池中重用连接?
如何在不重用旧连接(或套接字)的情况下获得新连接?
Psycopg2 默认情况下会在您调用 psycopg2.connect() 时重新使用与数据库的连接。很多次,所以如果多个绿色线程同时使用同一个连接,你会得到这个错误。
为避免这种情况,请使用连接池,例如 SQLAlchemy 或内置的 psycopg2.pool.
或者,您可以在每次需要连接到数据库时创建一个新的数据库连接。
import psycopg2
conn = psycopg2.connect(database="mydatabase", user="myusername", password="pass", host="myhost", port="myport", connection_factory=None)
注意,这可能很慢而且效率很低。
个人建议:使用连接池。