Python await 函数执行顺序的问题?-灵析社区

米小米会努力

下面这段代码中,为何 `ws.send_text("1")` 必须等待 `load_dataset("beans")` 加载完毕才会执行呢? 不应该是先执行 `ws.send_text("1")` 然后再执行 `load_dataset("beans")` 吗? > `load_dataset` > 是一个[加载模型数据集的函数](https://link.segmentfault.com/?enc=IpPF%2BLKiiEr5rz%2FYvfK%2FjA%3D%3D.EUwwjxnJR32yszl%2B7tXqe005fCuVAqNo99SBQ19gFuL6PwMduHeQ7gp49cX8FTjQ1fvstZA8abBmJvDwV3xn%2BvbQqcIxGRQH9Dq7%2F0H73IwS0zHoRwd%2FItm8a2XvLc7g)。 from fastapi import FastAPI, WebSocket from datasets import load_dataset app = FastAPI() @app.websocket("/") async def h(ws: WebSocket): await ws.accept() await ws.send_text("1") dataset = load_dataset("beans") await ws.send_text("2")

阅读量:18

点赞量:0

问AI
很疑惑啊。。。我把我的代码和版本什么的都贴出来,还有我的试验结果。。。我的结论还是第一个"await" 是正常 "send" 出去了的。 «1. 先贴结果» * 浏览器的结果 "image.png" (https://wmlx-new-image.oss-cn-shanghai.aliyuncs.com/images/20241022/2f128fdd9489e45147010d6a13068034.png) * 服务端的日志 "image.png" (https://wmlx-new-image.oss-cn-shanghai.aliyuncs.com/images/20241022/cfa19a0b877ac6aa7e154248e2916af6.png) «2. 我的依赖环境» fastapi = "^0.110.0" uvicorn = {extras = ["standard"], version = "^0.28.0"} websockets = "^12.0" datasets = "^2.18.0" «3. 我的示例代码» 为了能明确看出前后顺序差异,我加入了时间戳 "datetime.now()" 在每个信息内容上。 from datetime import datetime from datasets import load_dataset from fastapi import FastAPI, WebSocket from fastapi.responses import HTMLResponse app = FastAPI() html = """ Chat WebSocket Chat Send var ws = new WebSocket("ws://localhost:8081/ws"); ws.onmessage = function(event) { var messages = document.getElementById('messages') var message = document.createElement('li') var content = document.createTextNode(event.data) message.appendChild(content) messages.appendChild(message) }; function sendMessage(event) { var input = document.getElementById("messageText") ws.send(input.value) input.value = '' event.preventDefault() } """ @app.get("/") async def get(): return HTMLResponse(html) @app.websocket("/ws") async def h(ws: WebSocket): await ws.accept() await ws.send_text(f"1: {datetime.now()}") dataset = load_dataset("beans") print(f"time: {datetime.now()} => dataset: {dataset}") await ws.send_text(f"2: {datetime.now()}") while True: data = await ws.receive_text() await ws.send_text(f"Message text was: {data}, datetime: {datetime.now()}") 从我上面截图和我的实际操作来看,"1" 确实是先执行的,因为 "html" 接收到了 "ws" 的信息。 你可以拿我的去你那里在试验一下。。。