Python 3.4/3.5/3.6 的 coroutine 日渐成熟之后, Tornado 之类的异步框架是不是会逐渐没落? (非 web) - V2EX
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 15068 次点击
    这是一个创建于 3264 天前的主题,其中的信息可能已经有所发展或是发生改变。

    关于这个, 大家有什么看法? 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 Adroid
    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  
       201-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     Solana     895 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 211ms UTC 21:52 PVG 05:52 LAX 13:52 JFK 16:52
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86