Python Postgres 与绿色线程的连接

问题描述 投票:0回答:1

我正在使用 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
是否在某种隐式连接池中重用连接?

如何在不重用旧连接(或套接字)的情况下获得新连接?

python postgresql multithreading psycopg2 green-threads
1个回答
0
投票

Psycopg2 默认情况下会在您调用 psycopg2.connect() 时重新使用与数据库的连接。很多次,所以如果多个绿色线程同时使用同一个连接,你会得到这个错误。

为避免这种情况,请使用连接池,例如 SQLAlchemy 或内置的 psycopg2.pool.

或者,您可以在每次需要连接到数据库时创建一个新的数据库连接。

import psycopg2
conn = psycopg2.connect(database="mydatabase", user="myusername", password="pass", host="myhost", port="myport", connection_factory=None)

注意,这可能很慢而且效率很低。

个人建议:使用连接池。

© www.soinside.com 2019 - 2024. All rights reserved.