Flask插座.io:频繁超时

2024-09-24 00:31:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个烧瓶-插座.io非常标准的应用程序:

服务器:eventlet 我使用以下方式启动应用程序:socketio.run公司(应用程序,主机=“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

我不能解释这个回溯。有烧瓶经验的人可以吗-插座.io帮忙吗?在

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

编辑: 我有一些关于插座.io请求。发生上述异常后,将记录以下请求:

^{pr2}$

Tags: inpyselfenvresponselibpackagesline
1条回答
网友
1楼 · 发布于 2024-09-24 00:31:19

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


然后你可以看看socket.io official documentation website,尤其是client-api和{a3}。 因为在server-apithe httpsserver-options 部分(对于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的好提示

你可以添加一些

^{pr2}$

另一个提示可以是,针对超时问题调整前面的错误处理程序,并在触发此事件时重新运行服务器。在

您还可以注意到:

The message and data arguments of the current request can also be inspected with the request.event variable, which is useful for error logging and debugging outside the event handler

您也可以使用下面的代码来处理final套接字超时:超时错误:

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

相关问题 更多 >