Я настраиваю веб-приложение, используя Flask и Flask-socketio для Websockets, используя 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