在 Python 中,await
关键字用于挂起当前异步函数的执行,直到等待的异步操作完成。在你提供的代码中,await ws.send(1)
和 await ws.send(2)
会等待它们各自的发送操作完成。然而,它们并不会阻塞 load_dataset("beans")
的执行,因为 load_dataset
函数也是异步的(假设它使用了 async
和 await
)。
这意味着,await ws.send(1)
发送消息后,控制权会立即返回给事件循环,事件循环会检查是否有其他可以并行执行的异步任务。在这种情况下,load_dataset("beans")
可以开始执行,因为它也是一个异步函数。
所以,ws.send(1)
不需要等待 load_dataset("beans")
加载完毕才会执行。实际上,ws.send(1)
和 load_dataset("beans")
可能会并行执行,这取决于事件循环如何调度这些异步任务。
如果你发现 ws.send(1)
必须等待 load_dataset("beans")
加载完毕才会执行,可能是因为 load_dataset
函数实际上是同步的,或者它内部有一些同步操作导致它不能并行执行。你可以检查 load_dataset
函数的实现,确保它是异步的,并且没有阻塞操作。
另外,需要注意的是,由于 ws.send(1)
和 load_dataset("beans")
是并行执行的,所以它们之间的执行顺序并不是固定的。也就是说,有时候 ws.send(1)
可能先执行,有时候 load_dataset("beans")
可能先执行,这取决于事件循环的调度和当前系统的负载情况。
如果你需要确保 ws.send(1)
在 load_dataset("beans")
之前执行,你可以使用 await
来等待 ws.send(1)
的发送操作完成,然后再执行 load_dataset("beans")
。但是,这仍然不能保证 ws.send(1)
在 load_dataset("beans")
之前完成,因为这两个操作是并行执行的。如果你需要严格的执行顺序,你可能需要重新考虑你的代码结构,确保按照你想要的顺序执行操作。
很疑惑啊。。。我把我的代码和版本什么的都贴出来,还有我的试验结果。。。我的结论还是第一个
await
是正常send
出去了的。为了能明确看出前后顺序差异,我加入了时间戳
datetime.now()
在每个信息内容上。从我上面截图和我的实际操作来看,
1
确实是先执行的,因为html
接收到了ws
的信息。你可以拿我的去你那里在试验一下。。。