flask-socket.io:经常超时

问题描述 投票:6回答:1

我有一个非常标准的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
python websocket python-3.5 flask-socketio
1个回答
5
投票

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


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

  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:超时错误:

try:
    socketio.run(app,...
except socket.error as socketerror:
    print("Error: ", socketerror)
© www.soinside.com 2019 - 2024. All rights reserved.