不太明白 writer.write() 和 writer.write() await writer.drain()有什么区别

2021-04-21 14:26:29 +08:00
 aladdindingding
文档:
https://docs.python.org/zh-tw/3/library/asyncio-stream.html#streamwriter

不明白为什么要这么写,
stream.write(data)
await stream.drain()
个人理解 stream.write(data)本来就是非阻塞的,或者是什么场景下用 await stream.drain()呢
1582 次点击
所在节点    Python
6 条回复
66beta
2021-04-21 14:32:36 +08:00
不懂 python,但是文档里写了缓冲区需要回到最低水准才能继续写入
这里 await stream.drain() 应该为了保证你下一次对缓冲区的写入操作
abersheeran
2021-04-21 14:40:26 +08:00
这个就跟你写文件是一样的。write 只是写了,它可能留在缓冲区,在操作系统觉得合适的时候才真的去写入。drain 就类似于等待文件的 flush 完成。
aladdindingding
2021-04-21 14:43:40 +08:00
仔细看了一下文档: https://docs.python.org/zh-cn/3.7/library/asyncio-stream.html#asyncio.StreamWriter.drain
await writer.drain() 当 socket 缓冲区达到上限时后阻塞,没达到上限时后就相当于 stream.write(data)立刻返回。相当于一个保护机制吧
aladdindingding
2021-04-21 14:44:25 +08:00
@66beta 是滴!
dick20cm
2021-04-21 15:06:05 +08:00
writer.write 将数据 copy 到 buffer 并立即返回,writer.drain 实际执行 io 操作,因为 io 要切换时间片所以挂起当前协程,等带 sys 响应后再恢复现场
araraloren
2021-04-22 11:58:06 +08:00
如果你需要等待写入完成,你就必须 await 一下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/772178

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX