Тайм-аут подключения к сокету Flask-socketio - PullRequest
0 голосов
/ 21 октября 2019

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