当服务器卡在 while 循环中时,客户端收不到发出的值

client doesnt receive emitted value when server is stuck in while loop

我正在使用 flask SocketIO,这是我在服务器中的启动文件:

app = Flask(__name__)
app.config['SECRET_KEY'] = APP_SECRET_KEY
JWTManager(app)
CORS(app)
app.config['CORS_HEADERS'] = 'Content-Type'
app.config['transports'] = 'websocket'
app.config['JSON_SORT_KEYS'] = False
socketio = SocketIO(app, cors_allowed_origins="*")
socketio.run(app, host=SERVER_IP, debug=True)

我有一个简单的路由,它向客户端发出一条消息,它的目的是触发客户端向服务器发送一个代码,该代码将允许服务器退出 while 循环并继续执行路由。路线如下:

@app.route('/socket')
    def send_socket():
        socketio.emit('custom', {'data': 123})
        code = ''
        while not code :pass
        // another logic here - after code received

在客户端我订阅了那个事件:

socket.on('custom', (data) => {
     // emit the code to the server
    });

我还有一个按钮可以触发对服务器/socket 路由的 api 请求:

const response = await axios
      .get('http://serverip:5000/socket')
      .catch((error: AxiosError) => {
        console.log(error.response);
      });

发现 while 循环阻止客户端接收消息,因为服务器卡在 while 循环中客户端没有收到 'custom' 事件。只要我删除 while 循环,客户端就会收到消息。 有人可以解释为什么循环阻止客户端接收发射吗?我确定服务器确实发出了事件,因为只要我删除 while 事件就会到达回调,并且发出发生在循环之前。是否与 flask SocketIO eventlet 不处理线程有关?

问题是您的 while 循环阻塞了整个服务器,因为您 运行 在 eventlet 下。您可以在循环中尝试 运行 a sleep(0) 以防止阻塞:

while not code:
    socketio.sleep(0)