我试图用处理和flask_socketio
多eventlet
并发请求。然而,由于预期这是行不通的:当功能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
作为在GitHub上讨论,你需要插入socketio.sleep(0)
往往你可以在你长时间的计算内部通话,最好在一个循环中,使其发生在定期。这将允许eventlet调度到第一任务运行时给CPU到你的第二个任务。