websocket
from fastapi import WebSocket
@app.websocket('/ws')
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept() # 接收一个连接
while True:
data = await websocket.receive_text() # 接收客户端传来的信息
await websocket.send_text(data) # 发送信息到客户端
websocket 是异步的,如果需要做代理或者有多个函数并发的需求的话,可以采用异步协程的方式
loop = async.get_event_loop() # 获取事件循环对象
task = loop.create_task(get_guacamole_message(client, websocket)) # 添加异步事件
# 这时开始,两个协程会开始并发运行,在遇到await时进行切换,但是要求两个协程不能有太久的阻塞,不然就会导致两个协程运行时间差别太大了,还有可能出现
# 只有一个协程在运行,一个协程一直在等待的情况。
async def get_guacamole_message(client: GuacamoleClient, websocket: WebSocket):
loop = asyncio.get_event_loop()
try:
while True:
data = await loop.run_in_executor(None, client.receive) # 让同步函数在默认的线程池内运行,避免长时间阻塞
await WebSocket.send_text(data) # 发送数据到浏览器
except socket.timeout:
print('连接超时')