V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
abcdabcd987
V2EX  ›  问与答

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

  •  1
     
  •   abcdabcd987 · 2015-11-15 12:35:01 +08:00 · 3250 次点击
    这是一个创建于 3084 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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


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

    @ethego http://aiohttp.readthedocs.org/en/stable/ 这不是嘛,我就在用在 3.4 上。
    ethego
        14
    ethego  
       2015-11-15 13:53:20 +08:00
    @love 看了下这不是 web 框架啊,只是提供了 http server/client 的库,和 HTTPResponse 的作用一样,离框架还远。
    ethego
        15
    ethego  
       2015-11-15 13:55:33 +08:00
    @love 倒是可以考虑在这个 aiohttp 之上开发个 web 框架什么的
    ethego
        16
    ethego  
       2015-11-15 14:02:06 +08:00
    https://github.com/vkryachko/Vase
    看了下这个还不错
    love
        17
    love  
       2015-11-15 14:10:58 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1651 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 16:52 · PVG 00:52 · LAX 09:52 · JFK 12:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.