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

2021 年 4 月 21 日
 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()呢
2668 次点击
所在节点    Python
6 条回复
66beta
2021 年 4 月 21 日
不懂 python,但是文档里写了缓冲区需要回到最低水准才能继续写入
这里 await stream.drain() 应该为了保证你下一次对缓冲区的写入操作
abersheeran
2021 年 4 月 21 日
这个就跟你写文件是一样的。write 只是写了,它可能留在缓冲区,在操作系统觉得合适的时候才真的去写入。drain 就类似于等待文件的 flush 完成。
aladdindingding
2021 年 4 月 21 日
仔细看了一下文档: https://docs.python.org/zh-cn/3.7/library/asyncio-stream.html#asyncio.StreamWriter.drain
await writer.drain() 当 socket 缓冲区达到上限时后阻塞,没达到上限时后就相当于 stream.write(data)立刻返回。相当于一个保护机制吧
aladdindingding
2021 年 4 月 21 日
@66beta 是滴!
dick20cm
2021 年 4 月 21 日
writer.write 将数据 copy 到 buffer 并立即返回,writer.drain 实际执行 io 操作,因为 io 要切换时间片所以挂起当前协程,等带 sys 响应后再恢复现场
araraloren
2021 年 4 月 22 日
如果你需要等待写入完成,你就必须 await 一下

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

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

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

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

© 2021 V2EX