FastAPI websocket 示例是否会导致进程死锁?

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

文档中的代码有一个

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}")
python websocket fastapi
1个回答
2
投票

根据您问题中给出的代码示例,简短的答案是后续请求将通过(无论

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 密集型操作完成之前,不会再发送任何请求。

请参阅此答案了解有关此主题的更多详细信息和解决方案。

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