文档中的代码有一个
while True:
块,我很好奇类似的东西是否会导致进程陷入僵局。如果我收到两个请求,第二个请求会不会通过?为什么或为什么不?
来源:https://fastapi.tiangolo.com/advanced/websockets/
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
while True:
data = await websocket.receive_text()
await websocket.send_text(f"Message text was: {data}")
根据您问题中给出的代码示例,简短的答案是后续请求将通过(无论
while True
循环如何)并同时处理。
长的答案是取决于您想在
async def
函数/端点(包括while True
循环)内执行哪种操作,即非阻塞I/O绑定或阻塞I/O受限操作还是 CPU 受限操作?当使用 await
调用函数并涉及非阻塞 I/O 绑定操作(例如,等待来自客户端的数据通过网络发送或等待中的文件内容)要读取的磁盘),event loop
(在主线程中运行)可以继续并服务其他协程(请求),同时等待此类操作完成(即,在您的情况下,waiting使用 await websocket.receive_text()
和 await websocket.send_text()
来接收或
发送消息)。但是,如果您执行一些阻塞 I/O 密集型任务(例如,使用
requests
库执行 HTTP 请求)或 CPU 密集型任务(即音频或图像处理、机器学习等), event loop
会被阻塞;这意味着,在 I/O 密集型或 CPU 密集型操作完成之前,不会再发送任何请求。
请参阅此答案了解有关此主题的更多详细信息和解决方案。