我正在使用Flask和Flask-socketio for Websockets设置Web应用程序,并使用文档中建议的eventlet。
目的是创建一个编码平台,用户可以在该平台上订阅,参与当前的挑战,并且每次练习都可以提交自己的解决方案(一段代码),然后将通过测试用例在服务器上评估它们的正确性(它们编写一个函数,给定一些输入,如果不计入零分,则必须给出特定的输出)。
问题在于,在执行输出代码时,某些服务器端计算可能需要花费几秒钟才能完成,然后再将输出返回给客户端。在这种情况下,经过长时间的等待,客户端会在从服务器接收到数据后断开连接。您可以在下面看到一些重现该问题的代码,time.sleep表示长时间的服务器端计算,这将导致客户端断开连接并重新连接。
注意:在代码中,我放置了40秒钟的睡眠时间,即让客户端每次断开连接的时间较短(例如10到20之间),有时工作正常,有时断开连接。
为什么会这样?我该如何解决?
from flask import Flask
from flask_socketio import SocketIO
from flask_socketio import emit, disconnect
import time
import random
flask_app = Flask(__name__)
socketio = SocketIO(flask_app, async_mode='eventlet')
webpage = '''
<html>
<body>
<p id="demo">Some content</p>
<button type="button" onclick="do_on_server()">Do server-side computation</button>
<script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js" integrity="sha256-yr4fRk/GU1ehYJPAs8P4JlTgu0Hdsp4ZKrx8bDEDC3I=" crossorigin="anonymous"></script>
<script type="text/javascript" charset="utf-8">
var socket = io();
function do_on_server(){
socket.emit('do_on_server', {});
}
socket.on('feedback', feedback);
function feedback(data){
document.getElementById("demo").innerHTML = data["msg"];
}
</script>
</body>
</html>
'''
@flask_app.route('/')
def index():
return webpage
@socketio.on('do_on_server')
def do_on_server(json):
print('starting computation')
#long computation
time.sleep(40)
print('done computing')
emit('feedback', {'msg': random.random()})
@socketio.on('connect')
def on_connect():
print('Connected')
@socketio.on('disconnect')
def on_disconnect():
print('Disconnecting')
if __name__ == '__main__':
socketio.run(flask_app)
控制台输出:
>python socket_timeout.py
Connected
starting computation
done computing
Disconnecting
Connected