Flask-socketio Websocket连接超时

时间:2019-10-21 20:08:50

标签: python-3.x flask flask-socketio

我正在使用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

0 个答案:

没有答案