关于这个, 大家有什么看法? Tornado有什么优势是目前Py3原生coroutine没有的?
PS: 本人水平比较渣, 本帖子是请教, 不是开炮. 另外 Tornado 的 web 框架不做重点讨论, 只是他的 coroutine 部分.
谢谢了
1
PythonAnswer 2017-01-10 01:41:26 +08:00 1
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 Android
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 1
@jason0916 http://stackoverflow.com/a/16503103 SQL Alchemy 作者写的
|
24
JhZ7z587cYROBgVQ 2017-01-10 13:50:22 +08:00
@glasslion 谢啦,我去看看
|
25
doubleflower 2017-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 作为标准库本身是有优势的,就看个人选择了 |