在使用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堆栈。