flask-socket.io:经常超时

时间:2017-12-18 19:16:15

标签: python websocket python-3.5 flask-socketio

我有一个非常标准的flask-socket.io应用程序:

server:eventlet 我使用以下命令启动应用程序:socketio.run(app,host =' 0.0.0.0')

经常但并不总是我有某种超时:

Traceback (most recent call last):
  File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/eventlet/wsgi.py", line 507, in handle_one_response
    result = self.application(self.environ, start_response)
  File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/flask/app.py", line 1997, in __call__
    return self.wsgi_app(environ, start_response)
  File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/flask_socketio/__init__.py", line 42, in __call__
    start_response)
  File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/engineio/middleware.py", line 47, in __call__
    return self.engineio_app.handle_request(environ, start_response)
  File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/socketio/server.py", line 360, in handle_request
    return self.eio.handle_request(environ, start_response)
  File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/engineio/server.py", line 267, in handle_request
    environ, start_response)
  File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/engineio/socket.py", line 89, in handle_get_request
    start_response)
  File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/engineio/socket.py", line 130, in _upgrade_websocket
    return ws(environ, start_response)
  File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/engineio/async_eventlet.py", line 19, in __call__
    return super(WebSocketWSGI, self).__call__(environ, start_response)
  File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/eventlet/websocket.py", line 127, in __call__
    self.handler(ws)
  File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/engineio/socket.py", line 155, in _websocket_handler
    pkt = ws.wait()
  File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/eventlet/websocket.py", line 633, in wait
    for i in self.iterator:
  File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/eventlet/websocket.py", line 503, in _iter_frames
    message = self._recv_frame(message=fragmented_message)
  File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/eventlet/websocket.py", line 526, in _recv_frame
    header = recv(2)
  File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/eventlet/websocket.py", line 442, in _get_bytes
    d = self.socket.recv(numbytes - len(data))
  File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/eventlet/greenio/base.py", line 360, in recv
    return self._recv_loop(self.fd.recv, b'', bufsize, flags)
  File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/eventlet/greenio/base.py", line 354, in _recv_loop
    self._read_trampoline()
  File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/eventlet/greenio/base.py", line 325, in _read_trampoline
    timeout_exc=socket_timeout('timed out'))
  File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/eventlet/greenio/base.py", line 207, in _trampoline
    mark_as_closed=self._mark_as_closed)
  File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/eventlet/hubs/__init__.py", line 163, in trampoline
    return hub.switch()
  File "/projects/ici_chat_prototype01/env/lib/python3.5/site-packages/eventlet/hubs/hub.py", line 295, in switch
    return self.greenlet.switch()
socket.timeout: timed out

我无法解释此追溯。在flask-socket.io中有经验的人可以帮忙吗?

我没有发布任何代码,因为我不知道从哪里开始。回溯中的所有文件都来自已安装的模块。

编辑: 我收到了有关socket.io请求的更多信息。在上述异常之后,将记录以下请求:

127.0.0.1 - - [04/Jan/2018 10:10:51] "GET /socket.io/?EIO=3&transport=websocket&sid=f93955151a3a4576b2e96427cc27121e HTTP/1.1" 500 0 60.061493
127.0.0.1 - - [04/Jan/2018 10:10:51] "GET /socket.io/?EIO=3&transport=polling&t=1515056991349-3&sid=f93955151a3a4576b2e96427cc27121e HTTP/1.1" 400 218 60.001593
127.0.0.1 - - [04/Jan/2018 10:10:52] "GET /socket.io/?EIO=3&transport=polling&t=1515057052758-4 HTTP/1.1" 200 381 0.000875
(12472) accepted ('127.0.0.1', 39520) 
127.0.0.1 - - [04/Jan/2018 10:10:52] "POST /socket.io/?EIO=3&transport=polling&t=1515057052767-5&sid=10663b1e21e6492b81b5455ebc805408 HTTP/1.1" 200 219 0.001145

1 个答案:

答案 0 :(得分:5)

如果要切换到调试模式,可以使用socketio.run(app, host='0.0.0.0', port=5000, debug=True)

然后,您可以查看socket.io official documentation website,尤其是client-apiserver-api。 在the httpsserver-options server-api部分(对于javascript),您可以看到运行服务器时有一些选项,例如:

  pingInterval: 10000,
  pingTimeout: 5000,

当您使用socketio.run(app, host='0.0.0.0', port=5000, debug=True,pingInterval = 10000, pingTimeout= 5000)

运行服务器时,我希望这些参数可以重新用作 kwargs

flask-socketio文档中,在"错误处理"部分,有deal with exceptions

的好建议

您可以添加类似

的内容
@socketio.on_error_default  # handles all namespaces without an explicit error handler
def default_error_handler(e):
    pass

另一个提示可能是调整此前一个error_handler的超时问题,并在触发此事件时重新运行服务器。

您可能还会注意到:

  

还可以使用request.event变量检查当前请求的消息和数据参数,这对于事件处理程序外部的错误记录和调试很有用

您也可以使用以下代码来处理最终的 socket.timeout:timed out 错误:

try:
    socketio.run(app,...
except socket.error as socketerror:
    print("Error: ", socketerror)