使用eventlet flask_socketio并发

问题描述 投票:0回答:1

我试图用处理和flask_socketioeventlet并发请求。然而,由于预期这是行不通的:当功能test1()运行时,它会阻止功能test2()的执行作为在输出日志中看到。

我如何能实现服务器同时处理两个请求?

服务器(蟒蛇):

import eventlet
eventlet.monkey_patch()

from flask import Flask, render_template
from flask_socketio import SocketIO, send, emit

app = Flask(__name__)
socketio = SocketIO(app, async_mode='eventlet')

@socketio.on('test1')
def test1():
    print('test1 started')
    do_complicated_calculation() # takes some time
    print('test1 done')

@socketio.on('test2')
def test2():
    print('test2')

if __name__ == '__main__':
    socketio.run(app)

客户端(JavaScript的):

import io from 'socket.io-client';

socket = io('http://localhost:5000');
socket.emit('test1');
socket.emit('test2');

预期输出:

test1 started
test2
test1 done

实际输出:

test1 started
test1 done
test2
socket.io flask-socketio eventlet
1个回答
0
投票

作为在GitHub上讨论,你需要插入socketio.sleep(0)往往你可以在你长时间的计算内部通话,最好在一个循环中,使其发生在定期。这将允许eventlet调度到第一任务运行时给CPU到你的第二个任务。

© www.soinside.com 2019 - 2024. All rights reserved.