У меня возможная утечка соединений при потоковой передаче с помощью flask и gevent.
Многие соединения на стороне сервера остаются (после того, как они закрыты на стороне клиента) в состоянии CLOSE_WAIT
.
Это происходит не для всех клиентов, а только для некоторых из них (но для этих клиентов это происходит в 100% случаев).
Я использую стандартный потоковый код Flask, ничего особенного, поэтому яскажем, что проблема общая.
Вот мой код:
@app.route('/', defaults={'path': ''}, methods=['GET', 'POST'])
def catch_all(path):
session_id = 'tettris'
if session_id not in sessions:
session = Session()
sessions[session_id] = session
else:
session = sessions[session_id]
session.start()
queue = register_queue()
def events():
try:
if queue:
while True:
for _, data in queue:
yield data
finally:
# THIS POINT HERE IS NEVER BEING REACHED
# FOR SOME CLIENTS, becase the connection
# is getting stuck in the CLOSE_WAIT state
deregister_queue(queue)
if len(queues) == 0:
session.kill()
del sessions[session_id]
return Response(events(), content_type='text/event-stream')
Как видите, код тривиален и довольно стандартен.
Я полагаю, чтогде-то должно быть какое-то условие гонки, потому что, как я уже сказал, не все соединения оказываются в состоянии CLOSE_WAIT
.
Я полагаю, что это зависит от стека TCP / IP клиента.