V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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
aladdindingding
V2EX  ›  Python

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

  •  
  •   aladdindingding · 2021-04-21 14:26:29 +08:00 · 1558 次点击
    这是一个创建于 1072 天前的主题,其中的信息可能已经有所发展或是发生改变。
    文档:
    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-04-21 14:32:36 +08:00
    不懂 python,但是文档里写了缓冲区需要回到最低水准才能继续写入
    这里 await stream.drain() 应该为了保证你下一次对缓冲区的写入操作
    abersheeran
        2
    abersheeran  
       2021-04-21 14:40:26 +08:00
    这个就跟你写文件是一样的。write 只是写了,它可能留在缓冲区,在操作系统觉得合适的时候才真的去写入。drain 就类似于等待文件的 flush 完成。
    aladdindingding
        3
    aladdindingding  
    OP
       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
        4
    aladdindingding  
    OP
       2021-04-21 14:44:25 +08:00
    @66beta 是滴!
    dick20cm
        5
    dick20cm  
       2021-04-21 15:06:05 +08:00
    writer.write 将数据 copy 到 buffer 并立即返回,writer.drain 实际执行 io 操作,因为 io 要切换时间片所以挂起当前协程,等带 sys 响应后再恢复现场
    araraloren
        6
    araraloren  
       2021-04-22 11:58:06 +08:00
    如果你需要等待写入完成,你就必须 await 一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3001 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 14:49 · PVG 22:49 · LAX 07:49 · JFK 10:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.