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
eyp82
V2EX  ›  Python

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

  •  
  •   eyp82 · 2017-01-10 01:26:16 +08:00 · 14483 次点击
    这是一个创建于 2882 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    谢谢了

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

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

    twisted gevent 这类是正在淘汰的。
    lalalakakaka
        2
    lalalakakaka  
       2017-01-10 02:49:21 +08:00
    asyncio 本身好难用

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

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

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

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

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

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

    得等异步数据库发展,等 django 这类的东西自然被淘汰掉, aio 的 web 框架才会 nb 吧。
    eriale
        21
    eriale  
       2017-01-10 11:23:54 +08:00
    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  
       2017-01-10 11:24:46 +08:00
    @PythonAnswer twisted 被淘汰这我承认,因为写起来确实恶心,但是 gevent 被淘汰我不知道你是从哪里得出来的结论,gevent 这种应该说是最适合网络编程的,侵入性最小,如果你把一份同步的代码移植到 asyncio 或者 tornado 你就知道 gevent 的好了,在网络编程的场景,协程的切换基本都发生在阻塞 io 的时候,这就应该用库来帮你自动切换,而不是用一些 yield,await 之流的东西. 因此写网络应用程序的时候我个人是更喜欢 gevent. 而且现在我也没看到 gevent 有没落的迹象
    glasslion
        23
    glasslion  
       2017-01-10 13:45:25 +08:00   ❤️ 1
    JhZ7z587cYROBgVQ
        24
    JhZ7z587cYROBgVQ  
       2017-01-10 13:50:22 +08:00
    @glasslion 谢啦,我去看看
    doubleflower
        25
    doubleflower  
       2017-01-10 14:20:52 +08:00 via Android
    asyncio 只是一眼看上去比较难而已,真要学的话一两天就很熟了, tornado 市场肯定会越来越小
    XIVN1987
        26
    XIVN1987  
       2017-01-10 17:01:00 +08:00
    异步只在并发超级多的时候才特别有意义,绝大多数情况下用 Future 线程池更好,,
    neoblackcap
        27
    neoblackcap  
       2017-01-10 17:12:51 +08:00
    @yuyang yield , await 跟 gevent 没有本质的差异, gevent 你觉得不用手动切换那是你 monkeypatch 了然后 gevent 将底层 socket api 全部给你换了。这样带来一个问题就是,我压根就不知道现在我用的库支不支持 gevent monkeypatch ,隐式替代会给程序带来不可控。

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

    异步的数据库驱动坑多收益少,不如直接线程池,访问密集的地方,你真的会直接敢把流量打到数据库上吗?考虑异步数据库驱动的你真的需要吗?
    latyas
        35
    latyas  
       2017-01-11 00:50:38 +08:00
    @PythonAnswer django 肯定是活得最长的 python 的 web 框架啊,想什么呢?
    Geoion
        36
    Geoion  
       2017-01-11 01:59:26 +08:00
    那么异步访问数据库的问题何解?
    clino
        37
    clino  
       2017-01-11 09:17:17 +08:00
    @neoblackcap 即使是显示的替换也能减少工作量
    另外 asyncio 我还没怎么用过,但看 api 感觉有点乱,gevent 的接口比较自然,当然 asyncio 作为标准库本身是有优势的,就看个人选择了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2628 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 07:06 · PVG 15:06 · LAX 23:06 · JFK 02:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.