react-native - 当服务器卡在 while 循环中时,客户端没有收到发出的值
问题描述
我正在使用烧瓶 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循环中,客户端没有收到“自定义”事件。只要我删除 while 循环,客户端就会收到消息。有人能解释一下为什么循环阻止客户端接收发射吗?我确定服务器确实发出了事件,因为只要我删除了while,它就会到达回调,并且发出发生在循环之前。是否与烧瓶 SocketIO eventlet 不处理线程有关?
解决方案
问题是您的 while 循环阻塞了整个服务器,因为您在 eventlet 下运行。您可以尝试sleep(0)
在循环内运行以防止阻塞:
while not code:
socketio.sleep(0)
推荐阅读
- c# - Unity 3d 碰撞检测
- android - 使用 Mapbox Android 中的循环从 geojson 添加许多符号图标?
- sockets - 游戏客户端如何从服务器接收 UDP 数据?
- ios - 如何从 Gmail 应用程序嵌入式 Safari 浏览器在 iOS 上调试“400 错误请求”
- python - 在 Python 中使用范围函数
- python - 为接受两个参数的 C 模板类创建 Python 绑定
- c++ - node-addon-api 如何在 JS 和 C/C++ 之间来回传递 int 指针
- c++ - 使用字符串变量调用游戏函数
- php - 正则表达式提取尖括号之间的字符串,中间正好有一个 @ char
- r - 为什么在 R 中找不到定义的对象?