Flask + gevent:可能的套接字泄漏(处于CLOSE_WAIT状态)

时间:2019-04-02 17:59:52

标签: python sockets flask gevent

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

0 个答案:

没有答案