我正在使用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不处理线程有关吗?
问题是,当您在eventlet下运行时,while循环会阻塞整个服务器。您可以尝试在循环内运行sleep(0)
以防止阻塞:
while not code:
socketio.sleep(0)