Flask + gevent: возможная утечка сокетов (в состоянии CLOSE_WAIT) - PullRequest
0 голосов
/ 02 апреля 2019

У меня возможная утечка соединений при потоковой передаче с помощью 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 клиента.

...