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

2017-01-10 01:26:16 +08:00
 eyp82

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

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

谢谢了

14472 次点击
所在节点    Python
37 条回复
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
2017-01-10 11:24:46 +08:00
@PythonAnswer twisted 被淘汰这我承认,因为写起来确实恶心,但是 gevent 被淘汰我不知道你是从哪里得出来的结论,gevent 这种应该说是最适合网络编程的,侵入性最小,如果你把一份同步的代码移植到 asyncio 或者 tornado 你就知道 gevent 的好了,在网络编程的场景,协程的切换基本都发生在阻塞 io 的时候,这就应该用库来帮你自动切换,而不是用一些 yield,await 之流的东西. 因此写网络应用程序的时候我个人是更喜欢 gevent. 而且现在我也没看到 gevent 有没落的迹象
glasslion
2017-01-10 13:45:25 +08:00
JhZ7z587cYROBgVQ
2017-01-10 13:50:22 +08:00
@glasslion 谢啦,我去看看
doubleflower
2017-01-10 14:20:52 +08:00
asyncio 只是一眼看上去比较难而已,真要学的话一两天就很熟了, tornado 市场肯定会越来越小
XIVN1987
2017-01-10 17:01:00 +08:00
异步只在并发超级多的时候才特别有意义,绝大多数情况下用 Future 线程池更好,,
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
2017-01-10 18:31:30 +08:00
在公司用了 tornado 两年多了,和同步比起来确实有很多坑,但伸缩性更强确实是优点,没有 orm 支持确实是个麻烦,但换个方面想, coroutine 确实不怎么快,如果配合 orm 做很重的过程的话说起来和同步相比谁性能更高还不一定呢
quietin
2017-01-10 19:44:47 +08:00
gevent 比 tornado 优雅得多
clino
2017-01-10 20:15:05 +08:00
@neoblackcap 可以不 monkeypatch,直接 import gevent 里的东东好了
clino
2017-01-10 20:19:54 +08:00
为什么 monkeypatch 前面的 m 会断开?
zhouquanbest
2017-01-10 23:58:38 +08:00
@Gem @glasslion
异步 orm 有啊 比如 https://peewee-async.readthedocs.io/
配合 Tornado 妥妥的
neoblackcap
2017-01-11 00:07:57 +08:00
@clino ok ,那么问题来什么都要从 socket api 写起的话,那么我身为一个库的作者,为什么不依赖标准库而要用 gevent ?而且两者的效率是一样的,开发效率也是一样的。根据现在的 asyncio ,它还可以换 uvloop 来提高性能,虽然我认为都是人们在乱 benchmark 而已。
latyas
2017-01-11 00:49:00 +08:00
当然挺大 asyncio
asyncio 是标准库你们想什么呢,关于异步相关的操作和规范都朝着 asyncio 制定的, tornado 等其他框架只能效仿,没出来前 gevent tornado 什么的各搞各的, asyncio 作为标准库这是 python 异步 IO 的官方范本,楼上说的什么 tornado 也可以用 asyncio 啥的,这是把 tornado 当成纯粹的应用层的框架了吧,这个 tornado 毫无优势啊。

异步的数据库驱动坑多收益少,不如直接线程池,访问密集的地方,你真的会直接敢把流量打到数据库上吗?考虑异步数据库驱动的你真的需要吗?
latyas
2017-01-11 00:50:38 +08:00
@PythonAnswer django 肯定是活得最长的 python 的 web 框架啊,想什么呢?
Geoion
2017-01-11 01:59:26 +08:00
那么异步访问数据库的问题何解?
clino
2017-01-11 09:17:17 +08:00
@neoblackcap 即使是显示的替换也能减少工作量
另外 asyncio 我还没怎么用过,但看 api 感觉有点乱,gevent 的接口比较自然,当然 asyncio 作为标准库本身是有优势的,就看个人选择了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/333478

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX