python 下有什么方法能像 Node.js Promise 这样来写程序呢?

2015-11-15 12:35:01 +08:00
 abcdabcd987

写习惯了 Node.js 和 Promise ,现在换到 python 突然有点不适应。用 tornado 框架,发现其实仍然是阻塞的。所以说有没有能像 node.js 写 promise 这样的方法来写异步呢?或者说应该用另外的方法来优化?

3266 次点击
所在节点    问与答
17 条回复
messense
2015-11-15 12:38:58 +08:00
abcdabcd987
2015-11-15 12:52:29 +08:00
@messense 可以它例子里面的 AsyncHTTPClient 本身就是一个异步的函数了诶,对于那些只提供了同步版本的函数怎么办呢?
实在不行就只能手写用户态线程了囧
gamexg
2015-11-15 12:54:31 +08:00
不熟悉 nodejs , python Gevent 可以不改代码直接将多线程阻塞改为协程非阻塞模式。
abcdabcd987
2015-11-15 12:55:19 +08:00
@gamexg thx 我去查下
love
2015-11-15 13:11:15 +08:00
用 python 3.5 的话可以试试 asyncio , python 的下一代语言级异步框架,及这类框架 http://aiohttp.readthedocs.org/en/stable/
ethego
2015-11-15 13:14:17 +08:00
tornado 可以开 gevent ,话说 python2 下啥框架和 gevent 一起使用都可以做到协程非阻塞
abcdabcd987
2015-11-15 13:18:18 +08:00
@ethego
@gamexg
咦,我试着不改代码直接用 gevent 但是压力测试的结果是比原来还稍微慢了点,感觉我的问题不是 gevent 优化的对象?


@love 可惜用的是 python 3.4
ethego
2015-11-15 13:26:24 +08:00
python3.4 已经支持 asynco 了,不过貌似还没有基于 asynco 的 web 框架,需要手动造轮子。在并发不高的时候协程非阻塞本来就不见得比不用协程快吧,协程提升的只是在并发较高的时候的性能。
ethego
2015-11-15 13:27:01 +08:00
asyncio ,打了两遍居然都打错了。。
ethego
2015-11-15 13:28:12 +08:00
你人工制造一个阻塞,开 gevent 和不开就能看出差别。
abcdabcd987
2015-11-15 13:43:23 +08:00
@ethego 如果是等待数据库查询这样的阻塞(数据库 cpu 没有跑满), gevent 能优化掉么?
ethego
2015-11-15 13:50:40 +08:00
@abcdabcd987 这当然可以啊
love
2015-11-15 13:50:41 +08:00
@abcdabcd987 3.4 也可以的, 这个框架也支持 3.4 。

@ethego http://aiohttp.readthedocs.org/en/stable/ 这不是嘛,我就在用在 3.4 上。
ethego
2015-11-15 13:53:20 +08:00
@love 看了下这不是 web 框架啊,只是提供了 http server/client 的库,和 HTTPResponse 的作用一样,离框架还远。
ethego
2015-11-15 13:55:33 +08:00
@love 倒是可以考虑在这个 aiohttp 之上开发个 web 框架什么的
ethego
2015-11-15 14:02:06 +08:00
https://github.com/vkryachko/Vase
看了下这个还不错
love
2015-11-15 14:10:58 +08:00

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

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

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

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

© 2021 V2EX