我偶尔会遇到烧瓶插座问题,我不知道如何解决它。
我的客户端连接到我的socket-io服务器并执行一些聊天会话。它工作得很好。但由于某种原因,有时从客户端,有一些阻止整个服务器的调用(服务器停留在进程中,所有其他调用都被冻结)。奇怪的是,只要客户端应用程序没有完全关闭,服务器就可以被阻止。这是一个ios-app / web页面,我必须完全关闭app或safari页面。关闭套接字本身,甚至解除分配它并不能解决问题。当应用程序在后台时,套接字将关闭并取消分配,但问题仍然存在。
这是一个小型服务器,它处理html页面和socket-server,所以我不知道它是socket本身还是阻止进程的html。但每次服务器冻结时,日志都会显示一些套接字调用。
以下是我配置服务器的方式:
socketio = SocketIO(app, ping_timeout=5)
socketio.run(app, host='0.0.0.0', port=5001, debug=True, ssl_context=context)
所以我的问题是: 什么可以冻结服务器(这似乎发生在我没有做任何事情时让我的应用程序或网站长时间打开)。如果我正常使用服务,服务器永远不会冻结。我怎么能阻止它发生(即使我不知道是什么导致这种情况,有没有办法盲目地阻止我的服务器卡在电话中?
感谢您的回答
答案 0 :(得分:1)
根据您上面的评论,您正在使用Flask开发Web服务器,而无需异步框架(如eventlet或gevent)的帮助。除了这个选项非常低效,你应该知道这个Web服务器没有经过测试,它适用于开发过程中的短期测试。我不确定它能够运行很长时间,特别是在Flask-SocketIO通过的不寻常条件下,常规的Flask应用程序不能运行。我认为很可能你在Werkzeug中遇到了一些让它挂起的晦涩的bug。
我的建议是安装eventlet并重试。您需要做的就是pip install eventlet
,假设您没有传递明确的async_mode
参数,那么只需安装此软件包,Flask-SocketIO就应该自行配置使用它。
我还会删除显式超时设置。几乎在所有情况下,默认值都足以维持健康的连接。