Backgroud :
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 закроетсястарые соединения с БД сначала , мы предполагаем, что основной поток равен Thread-1 , затем в Thread-1 мы вызываем функцию socketio, это Thread-2, поскольку соединение с dbthreadlocal, поэтому методы closed_old_connections непригодны для соединений db в sockertio (Thread-2), поэтому после длительного создания соединения (> CONN_MAX_AGE) соединения в Thread-2 могут по-прежнему открываться, но соединение непригодно для использования. вызовет проблемуm
OperationError: server_closed_the_connection_unexpectedly
This_probably_means_the_server_terminated_abnormally
before_or_while_processing_the_request.
Теперь я решаю проблему, закрывая старые соединения с БД в функциях обработчика socketio вручную, но я не думаю, что это достаточно хорошо, потому что нам нужно закрыть соединения в каждом обработчике, который вызоветфункция базы данных. И я не нашел основную причину, по которой соединения будут непригодными, если они не будут закрыты