Python 调用WebSocket.close时,现有的等待将发生什么

Python 调用WebSocket.close时,现有的等待将发生什么,python,websocket,python-asyncio,fastapi,starlette,Python,Websocket,Python Asyncio,Fastapi,Starlette,如果我打开Starlette/FastAPI WebSocket,那么如果我从协同程序外部关闭WebSocket,当前等待从客户端接收数据的任何协同程序会发生什么情况?对receive的调用是否会引发异常,或者协同程序是否会永远留在内存中,因为它永远不会接收任何内容 from fastapi import FastAPI from fastapi.websockets import WebSocket app = FastAPI() open_sockets = {} @app.webso

如果我打开Starlette/FastAPI WebSocket,那么如果我从协同程序外部关闭WebSocket,当前等待从客户端接收数据的任何协同程序会发生什么情况?对
receive
的调用是否会引发异常,或者协同程序是否会永远留在内存中,因为它永远不会接收任何内容

from fastapi import FastAPI
from fastapi.websockets import WebSocket

app = FastAPI()

open_sockets = {}

@app.websocket('/connection/')
async def connection(websocket: WebSocket):
    await websocket.accept()

    id = await websocket.receive_json()['id']
    open_sockets[id] = websocket

    while True:
        data = await websocket.receive_json()

@app.post('/kill/{id}/')
async def kill(id=str):
    # What does this do to the above `await websocket.receive_json()`?
    await open_sockets[id].close()
    del open_sockets[id]

它将引发一个带有代码1006的
starlette.websockets.WebSocketDisconnect

  File ".\websocket_close_test.py", line 27, in connection
    data = await websocket.receive_json()
  File "C:\Apps\Python38\lib\site-packages\starlette\websockets.py", line 98, in receive_json
    self._raise_on_disconnect(message)
  File "C:\Apps\Python38\lib\site-packages\starlette\websockets.py", line 80, in _raise_on_disconnect
    raise WebSocketDisconnect(message["code"])
我确实注意到.close()调用被阻塞了一段时间

这是我用来测试的代码,第二个
ws.send
从未收到

导入时间
导入请求
导入websocket
ws=websocket.websocket()
connect(“ws://localhost:8000/connection/”)
打印('发送id 0')
ws.send(“{”id:“0”}”)
时间。睡眠(2)
打印('结束id 0')
请求。邮寄('http://localhost:8000/kill/0/')
打印('id 0已关闭')
时间。睡眠(2)
打印('尝试在关闭的连接上发送数据')
ws.send(“{”id:“10”}”)