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