
关于这个, 大家有什么看法? Tornado有什么优势是目前Py3原生coroutine没有的?
PS: 本人水平比较渣, 本帖子是请教, 不是开炮. 另外 Tornado 的 web 框架不做重点讨论, 只是他的 coroutine 部分.
谢谢了
1 PythonAnswer 2017-01-10 01:41:26 +08:00 tornado 支持新的写法。是目前最高级的异步框架了。 asyncio 的框架目前还没有怪兽型的出来统一江湖。 twisted gevent 这类是正在淘汰的。 |
2 lalalakakaka 2017-01-10 02:49:21 +08:00 asyncio 本身好难用 只是看语法的话,我还以为 gevent 是原生方法呢 就像 jQ 之余 JS 一样,虽然 JS 原生越来越强大,但是 JQ 用起来更快捷方便啊。 并且 python 原生异步方法的进步也可以提升 gevent 以及 tornado 的性能,使他们内部实现更高效简单,这是个双赢过程。 |
3 kongkongyzt 2017-01-10 07:40:10 +08:00 via Adroid asyncio 确实难用 现在用上这个特性比较出名的 web 框架,也就 sanit 了 |
4 phrack 2017-01-10 08:45:26 +08:00 via Android 我还以为是我菜才觉得 asyncio 难用,看了这个帖子我放心了。 |
5 strahe 2017-01-10 09:23:28 +08:00 最近在用 aiohttp ,实话说,感觉优雅,就是扩展太少。 |
6 janxin 2017-01-10 09:26:39 +08:00 不是很明白 asyncio 难用在哪个地方呢?因为太底层了缺少一些上层封装? |
7 janxin 2017-01-10 09:28:09 +08:00 我记得 Ben Darnell 来 pycon China 的时候提过考虑将底层 event loop 替换成 asyncio |
8 zhouquanbest 2017-01-10 09:47:23 +08:00 Tornado 可以直接使用 asyncio http://www.tornadoweb.org/en/stable/asyncio.html 只需要 AsyncIOMainLoop().install() |
9 Gem 2017-01-10 09:56:38 +08:00 什么时候出来一个成熟强大的异步 ORM ? |
10 raptor 2017-01-10 10:07:45 +08:00 重要的是数据库驱动要支持异步 |
12 JhZ7z587cYROBgVQ 2017-01-10 10:26:24 +08:00 @glasslion 为啥会天然排斥啊?我不是很明白 orz |
13 clino 2017-01-10 10:28:51 +08:00 twisted 没落就算了, gevent 我觉得还是挺好的,asyncio 应该不能完全替代吧? |
14 JhZ7z587cYROBgVQ 2017-01-10 10:32:43 +08:00 @clino 其实 asyncio 也有替代品,可以用 uvloop 和 curio 来代替的 |
15 est 2017-01-10 10:33:42 +08:00 gevent 可以再战 200 年。 从性能和写法上来说都是最优解。 不服罚抄 twisted 100 遍。 |
16 jmp2x 2017-01-10 10:34:54 +08:00 算是对 Tornado 粉转黑, 一个框架好不好并不仅仅在于框架本身, 更要在于周围的环境和中间件, 比如现在还没有好的数据库 driver, 即使有些是异步, 也并不适用于生产环境. 另一个 Torando 进行模块化设计时十分不美观 你需要在所有的子函数都加上异步装饰器, 其实说白了还是用的人少, 深入研究的人少, 导致周边环境不是很好. |
18 guyskk 2017-01-10 10:49:41 +08:00 via Android 同步的代码比异步的好写,坑少,逻辑更容易理解,对性能要求不高的没必要异步。对性能要求高的,可能会用 gevent , asyncio 这些异步库,也可能会用 c, rust 这些语言实现。但是 asyncio 太底层了,概念超级多,直接用太复杂了,但进了标准库说明它足够优秀,灵活性和可拓展性是别的轮子没法比的,估计 1~2 年内就会有成熟框架出现。 |
20 PythonAnswer 2017-01-10 11:21:14 +08:00 本机 io 其实 asyncio 挺好用的。 aiohttp 写个小爬虫也挺方便。 web 框架方面,应该和 tornado 合力发展,两个都会变强。 得等异步数据库发展,等 django 这类的东西自然被淘汰掉, aio 的 web 框架才会 nb 吧。 |
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/ |
22 yuyang 2017-01-10 11:24:46 +08:00 @PythonAnswer twisted 被淘汰这我承认,因为写起来确实恶心,但是 gevent 被淘汰我不知道你是从哪里得出来的结论,gevent 这种应该说是最适合网络编程的,侵入性最小,如果你把一份同步的代码移植到 asyncio 或者 tornado 你就知道 gevent 的好了,在网络编程的场景,协程的切换基本都发生在阻塞 io 的时候,这就应该用库来帮你自动切换,而不是用一些 yield,await 之流的东西. 因此写网络应用程序的时候我个人是更喜欢 gevent. 而且现在我也没看到 gevent 有没落的迹象 |
23 glasslion 2017-01-10 13:45:25 +08:00 @jason0916 http://stackoverflow.com/a/16503103 SQL Alchemy 作者写的 |
24 JhZ7z587cYROBgVQ 2017-01-10 13:50:22 +08:00 @glasslion 谢啦,我去看看 |
25 doubleflower 201-01-10 14:20:52 +08:00 via Android asyncio 只是一眼看上去比较难而已,真要学的话一两天就很熟了, tornado 市场肯定会越来越小 |
26 XIVN1987 2017-01-10 17:01:00 +08:00 异步只在并发超级多的时候才特别有意义,绝大多数情况下用 Future 线程池更好,, |
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 ,应用层协议就可以自动解析?不能自动解析的话,那么比什么? |
28 sujin190 2017-01-10 18:31:30 +08:00 在公司用了 tornado 两年多了,和同步比起来确实有很多坑,但伸缩性更强确实是优点,没有 orm 支持确实是个麻烦,但换个方面想, coroutine 确实不怎么快,如果配合 orm 做很重的过程的话说起来和同步相比谁性能更高还不一定呢 |
29 quietin 2017-01-10 19:44:47 +08:00 gevent 比 tornado 优雅得多 |
30 clino 2017-01-10 20:15:05 +08:00 via Android @neoblackcap 可以不 monkeypatch,直接 import gevent 里的东东好了 |
31 clino 2017-01-10 20:19:54 +08:00 via Android 为什么 monkeypatch 前面的 m 会断开? |
32 zhouquanbest 2017-01-10 23:58:38 +08:00 |
33 neoblackcap 2017-01-11 00:07:57 +08:00 @clino ok ,那么问题来什么都要从 socket api 写起的话,那么我身为一个库的作者,为什么不依赖标准库而要用 gevent ?而且两者的效率是一样的,开发效率也是一样的。根据现在的 asyncio ,它还可以换 uvloop 来提高性能,虽然我认为都是人们在乱 benchmark 而已。 |
34 latyas 2017-01-11 00:49:00 +08:00 当然挺大 asyncio asyncio 是标准库你们想什么呢,关于异步相关的操作和规范都朝着 asyncio 制定的, tornado 等其他框架只能效仿,没出来前 gevent tornado 什么的各搞各的, asyncio 作为标准库这是 python 异步 IO 的官方范本,楼上说的什么 tornado 也可以用 asyncio 啥的,这是把 tornado 当成纯粹的应用层的框架了吧,这个 tornado 毫无优势啊。 异步的数据库驱动坑多收益少,不如直接线程池,访问密集的地方,你真的会直接敢把流量打到数据库上吗?考虑异步数据库驱动的你真的需要吗? |
35 latyas 2017-01-11 00:50:38 +08:00 @PythonAnswer django 肯定是活得最长的 python 的 web 框架啊,想什么呢? |
36 Geoion 2017-01-11 01:59:26 +08:00 那么异步访问数据库的问题何解? |
37 clino 2017-01-11 09:17:17 +08:00 @neoblackcap 即使是显示的替换也能减少工作量 另外 asyncio 我还没怎么用过,但看 api 感觉有点乱,gevent 的接口比较自然,当然 asyncio 作为标准库本身是有优势的,就看个人选择了 |