aladdindingding
V2EX  ›  Python

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

By aladdindingding at 2021 年 4 月 21 日 · 2832 次点击
文档:
https://docs.python.org/zh-tw/3/library/asyncio-stream.html#streamwriter

不明白为什么要这么写,
stream.write(data)
await stream.drain()
个人理解 stream.write(data)本来就是非阻塞的,或者是什么场景下用 await stream.drain()呢
6 条回复  •  2021-04-22 11:58:06 +08:00
66beta
   1
66beta  
   2021 年 4 月 21 日
不懂 python,但是文档里写了缓冲区需要回到最低水准才能继续写入
这里 await stream.drain() 应该为了保证你下一次对缓冲区的写入操作
abersheeran
   2
abersheeran  
   2021 年 4 月 21 日
这个就跟你写文件是一样的。write 只是写了,它可能留在缓冲区,在操作系统觉得合适的时候才真的去写入。drain 就类似于等待文件的 flush 完成。
aladdindingding
   3
aladdindingding  
OP
   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
   4
aladdindingding  
OP
   2021 年 4 月 21 日
@66beta 是滴!
dick20cm
   5
dick20cm  
   2021 年 4 月 21 日
writer.write 将数据 copy 到 buffer 并立即返回,writer.drain 实际执行 io 操作,因为 io 要切换时间片所以挂起当前协程,等带 sys 响应后再恢复现场
araraloren
   6
araraloren  
   2021 年 4 月 22 日
如果你需要等待写入完成,你就必须 await 一下
推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide
© 2026 V2EX · 33ms · 3.9.8.5