V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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
eyp82
V2EX  ›  Python

Python 3.4/3.5/3.6 的 coroutine 日渐成熟之后, Tornado 之类的异步框架是不是会逐渐没落? (非 web)

  •  
  •   eyp82 · Jan 10, 2017 · 15319 views
    This topic created in 3403 days ago, the information mentioned may be changed or developed.

    关于这个, 大家有什么看法? Tornado有什么优势是目前Py3原生coroutine没有的?

    PS: 本人水平比较渣, 本帖子是请教, 不是开炮. 另外 Tornado 的 web 框架不做重点讨论, 只是他的 coroutine 部分.

    谢谢了

    Supplement 1  ·  Jan 10, 2017
    谢谢各位的指点, 为免水了这个页面, 我就不在下面一一回复致谢了.
    37 replies    2017-01-11 09:17:17 +08:00
    PythonAnswer
        1
    PythonAnswer  
       Jan 10, 2017   ❤️ 1
    tornado 支持新的写法。是目前最高级的异步框架了。

    asyncio 的框架目前还没有怪兽型的出来统一江湖。

    twisted gevent 这类是正在淘汰的。
    lalalakakaka
        2
    lalalakakaka  
       Jan 10, 2017
    asyncio 本身好难用

    只是看语法的话,我还以为 gevent 是原生方法呢
    就像 jQ 之余 JS 一样,虽然 JS 原生越来越强大,但是 JQ 用起来更快捷方便啊。

    并且 python 原生异步方法的进步也可以提升 gevent 以及 tornado 的性能,使他们内部实现更高效简单,这是个双赢过程。
    kongkongyzt
        3
    kongkongyzt  
       Jan 10, 2017 via Android
    asyncio 确实难用

    现在用上这个特性比较出名的 web 框架,也就 sanit 了
    phrack
        4
    phrack  
       Jan 10, 2017 via Android
    我还以为是我菜才觉得 asyncio 难用,看了这个帖子我放心了。
    strahe
        5
    strahe  
       Jan 10, 2017
    最近在用 aiohttp ,实话说,感觉优雅,就是扩展太少。
    janxin
        6
    janxin  
       Jan 10, 2017
    不是很明白 asyncio 难用在哪个地方呢?因为太底层了缺少一些上层封装?
    janxin
        7
    janxin  
       Jan 10, 2017
    我记得 Ben Darnell 来 pycon China 的时候提过考虑将底层 event loop 替换成 asyncio
    zhouquanbest
        8
    zhouquanbest  
       Jan 10, 2017
    Tornado 可以直接使用 asyncio
    http://www.tornadoweb.org/en/stable/asyncio.html
    只需要 AsyncIOMainLoop().install()
    Gem
        9
    Gem  
       Jan 10, 2017
    什么时候出来一个成熟强大的异步 ORM ?
    raptor
        10
    raptor  
       Jan 10, 2017
    重要的是数据库驱动要支持异步
    glasslion
        11
    glasslion  
       Jan 10, 2017
    @Gem ORM 和 异步 天然互斥
    JhZ7z587cYROBgVQ
        12
    JhZ7z587cYROBgVQ  
       Jan 10, 2017
    @glasslion 为啥会天然排斥啊?我不是很明白 orz
    clino
        13
    clino  
       Jan 10, 2017
    twisted 没落就算了, gevent 我觉得还是挺好的,asyncio 应该不能完全替代吧?
    JhZ7z587cYROBgVQ
        14
    JhZ7z587cYROBgVQ  
       Jan 10, 2017
    @clino 其实 asyncio 也有替代品,可以用 uvloop 和 curio 来代替的
    est
        15
    est  
       Jan 10, 2017
    gevent 可以再战 200 年。

    从性能和写法上来说都是最优解。

    不服罚抄 twisted 100 遍。
    jmp2x
        16
    jmp2x  
       Jan 10, 2017
    算是对 Tornado 粉转黑, 一个框架好不好并不仅仅在于框架本身, 更要在于周围的环境和中间件, 比如现在还没有好的数据库 driver, 即使有些是异步, 也并不适用于生产环境. 另一个 Torando 进行模块化设计时十分不美观 你需要在所有的子函数都加上异步装饰器, 其实说白了还是用的人少, 深入研究的人少, 导致周边环境不是很好.
    Gem
        17
    Gem  
       Jan 10, 2017
    @glasslion Motor ?
    guyskk
        18
    guyskk  
       Jan 10, 2017 via Android
    同步的代码比异步的好写,坑少,逻辑更容易理解,对性能要求不高的没必要异步。对性能要求高的,可能会用 gevent , asyncio 这些异步库,也可能会用 c, rust 这些语言实现。但是 asyncio 太底层了,概念超级多,直接用太复杂了,但进了标准库说明它足够优秀,灵活性和可拓展性是别的轮子没法比的,估计 1~2 年内就会有成熟框架出现。
    Gem
        19
    Gem  
       Jan 10, 2017
    @glasslion 嗯, Motor 不合适, nodejs 中的 Sequelize ?
    PythonAnswer
        20
    PythonAnswer  
       Jan 10, 2017
    本机 io 其实 asyncio 挺好用的。 aiohttp 写个小爬虫也挺方便。

    web 框架方面,应该和 tornado 合力发展,两个都会变强。

    得等异步数据库发展,等 django 这类的东西自然被淘汰掉, aio 的 web 框架才会 nb 吧。
    eriale
        21
    eriale  
       Jan 10, 2017
    python3.5 引入的 async/await 是新语法,新语法在 tornado 上也可以用。
    至于从 python3.4 引入的 asyncio 标准库,也存在一些问题,比如学习曲线陡峭、解决不了 backpressure 这样的网络问题。 https://vorpus.org/blog/some-thoughts-on-asynchronous-api-design-in-a-post-asyncawait-world/
    yuyang
        22
    yuyang  
       Jan 10, 2017
    @PythonAnswer twisted 被淘汰这我承认,因为写起来确实恶心,但是 gevent 被淘汰我不知道你是从哪里得出来的结论,gevent 这种应该说是最适合网络编程的,侵入性最小,如果你把一份同步的代码移植到 asyncio 或者 tornado 你就知道 gevent 的好了,在网络编程的场景,协程的切换基本都发生在阻塞 io 的时候,这就应该用库来帮你自动切换,而不是用一些 yield,await 之流的东西. 因此写网络应用程序的时候我个人是更喜欢 gevent. 而且现在我也没看到 gevent 有没落的迹象
    glasslion
        23
    glasslion  
       Jan 10, 2017   ❤️ 1
    JhZ7z587cYROBgVQ
        24
    JhZ7z587cYROBgVQ  
       Jan 10, 2017
    @glasslion 谢啦,我去看看
    doubleflower
        25
    doubleflower  
       Jan 10, 2017 via Android
    asyncio 只是一眼看上去比较难而已,真要学的话一两天就很熟了, tornado 市场肯定会越来越小
    XIVN1987
        26
    XIVN1987  
       Jan 10, 2017
    异步只在并发超级多的时候才特别有意义,绝大多数情况下用 Future 线程池更好,,
    neoblackcap
        27
    neoblackcap  
       Jan 10, 2017
    @yuyang yield , await 跟 gevent 没有本质的差异, gevent 你觉得不用手动切换那是你 monkeypatch 了然后 gevent 将底层 socket api 全部给你换了。这样带来一个问题就是,我压根就不知道现在我用的库支不支持 gevent monkeypatch ,隐式替代会给程序带来不可控。

    在我看来拿 asyncio 跟 Tornado 比都是耍流氓。 Tornado 就一个网络框架, asyncio 是一个网络库。两者要干的事情压根就不一样。 asyncio 更多是一个接口规范,虽然自带一个实现。单用 asyncio ,应用层协议就可以自动解析?不能自动解析的话,那么比什么?
    sujin190
        28
    sujin190  
       Jan 10, 2017
    在公司用了 tornado 两年多了,和同步比起来确实有很多坑,但伸缩性更强确实是优点,没有 orm 支持确实是个麻烦,但换个方面想, coroutine 确实不怎么快,如果配合 orm 做很重的过程的话说起来和同步相比谁性能更高还不一定呢
    quietin
        29
    quietin  
       Jan 10, 2017
    gevent 比 tornado 优雅得多
    clino
        30
    clino  
       Jan 10, 2017 via Android
    @neoblackcap 可以不 monkeypatch,直接 import gevent 里的东东好了
    clino
        31
    clino  
       Jan 10, 2017 via Android
    为什么 monkeypatch 前面的 m 会断开?
    zhouquanbest
        32
    zhouquanbest  
       Jan 10, 2017
    @Gem @glasslion
    异步 orm 有啊 比如 https://peewee-async.readthedocs.io/
    配合 Tornado 妥妥的
    neoblackcap
        33
    neoblackcap  
       Jan 11, 2017
    @clino ok ,那么问题来什么都要从 socket api 写起的话,那么我身为一个库的作者,为什么不依赖标准库而要用 gevent ?而且两者的效率是一样的,开发效率也是一样的。根据现在的 asyncio ,它还可以换 uvloop 来提高性能,虽然我认为都是人们在乱 benchmark 而已。
    latyas
        34
    latyas  
       Jan 11, 2017
    当然挺大 asyncio
    asyncio 是标准库你们想什么呢,关于异步相关的操作和规范都朝着 asyncio 制定的, tornado 等其他框架只能效仿,没出来前 gevent tornado 什么的各搞各的, asyncio 作为标准库这是 python 异步 IO 的官方范本,楼上说的什么 tornado 也可以用 asyncio 啥的,这是把 tornado 当成纯粹的应用层的框架了吧,这个 tornado 毫无优势啊。

    异步的数据库驱动坑多收益少,不如直接线程池,访问密集的地方,你真的会直接敢把流量打到数据库上吗?考虑异步数据库驱动的你真的需要吗?
    latyas
        35
    latyas  
       Jan 11, 2017
    @PythonAnswer django 肯定是活得最长的 python 的 web 框架啊,想什么呢?
    Geoion
        36
    Geoion  
       Jan 11, 2017
    那么异步访问数据库的问题何解?
    clino
        37
    clino  
       Jan 11, 2017
    @neoblackcap 即使是显示的替换也能减少工作量
    另外 asyncio 我还没怎么用过,但看 api 感觉有点乱,gevent 的接口比较自然,当然 asyncio 作为标准库本身是有优势的,就看个人选择了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   757 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 97ms · UTC 20:36 · PVG 04:36 · LAX 13:36 · JFK 16:36
    ♥ Do have faith in what you're doing.