背景:
django + Postgres + socketio
说明:
python_socketio :我创建了同步套接字以处理某些功能,并且它将创建一个持久性线程来处理sockerio事件
django :在django处理函数中,我调用socketio方法,例如:
class MyDangoHandler(object):
def myfunction(self):
socket_io_client.emit(
event=ClientEvents.MyEvent,
data={
"id": 1
}
)
在sockerio事件处理程序中,我将调用postgres数据库以获取一些数据。
我们知道在一个请求django will close the old db connections first中,我们假设主线程是 Thread-1 ,然后在Thread-1中,我们调用socketio函数,它是Thread- 2,由于数据库连接是线程本地的,所以closed_old_connections方法不适用于sockertio(Thread-2)中的数据库连接,因此在长时间创建连接(> CONN_MAX_AGE)之后,Thread-2中的连接仍可能打开,但连接无法使用,将导致问题
OperationError: server_closed_the_connection_unexpectedly
This_probably_means_the_server_terminated_abnormally
before_or_while_processing_the_request.
现在,我通过手动关闭socketio处理函数中的旧数据库连接来解决问题,但是我认为这还不够好,因为我们需要关闭每个处理程序中将调用数据库函数的连接。而且我没有找到根本原因,如果不关闭连接,连接将不可用