V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ansheng
V2EX  ›  程序员

如何学习 Tornado 异步非阻塞?

  •  
  •   ansheng ·
    anshengme · 2016-12-06 08:51:20 +08:00 · 3011 次点击
    这是一个创建于 2888 天前的主题,其中的信息可能已经有所发展或是发生改变。

    表示昨天找了很多文章,都说了些怎么用异步,却没有提到异步的精髓,比如future,@tornado.web.asynchronous@gen.coroutine装饰器,搞得现在都不知道从哪儿开始看了,看过这部分源码的提个建议呗。

    20 条回复    2016-12-07 10:26:38 +08:00
    wuxc
        1
    wuxc  
       2016-12-06 09:02:35 +08:00
    从第一个版本开始看,还是挺好懂的。 https://github.com/tornadoweb/tornado
    顺便安利下我用为了看这个的写的个小工具 https://github.com/wuxc/gitjump
    Ahri
        2
    Ahri  
       2016-12-06 09:22:36 +08:00
    这个已经过时了,现在都用 asyncio 。
    ericls
        3
    ericls  
       2016-12-06 09:22:44 +08:00
    手动写一个 event loop 来实现同样的效果
    ericls
        4
    ericls  
       2016-12-06 09:23:19 +08:00
    @Ahri asyncio 提供的是一个 api 和一个默认的 event loop
    smartdie
        5
    smartdie  
       2016-12-06 09:32:56 +08:00
    先了解 python 的协程, yield 关键字
    再看 @gen.coroutine 的源码就好理解了
    ansheng
        6
    ansheng  
    OP
       2016-12-06 09:33:12 +08:00
    @wuxc 官方文档一篇篇看??
    ansheng
        7
    ansheng  
    OP
       2016-12-06 09:33:54 +08:00
    @smartdie thx,现在就在看 @gen.coroutine 了,主要是不知道应该从哪儿看起,网上文档太乱了。
    zhuangzhuang1988
        8
    zhuangzhuang1988  
       2016-12-06 10:10:45 +08:00
    future 这个最好看别的语言的, C#的 task, java 的 Future
    @tornado.web.asynchronous 记得开始的时候这个就是简单个标志, 让函数结束的时候不关闭 socket, 可以继续传输数据
    @gen.coroutine 这个看 http://aosabook.org/en/500L/a-web-crawler-with-asyncio-coroutines.html http://www.dabeaz.com/coroutines/index.html 这 2 个
    ansheng
        9
    ansheng  
    OP
       2016-12-06 10:37:42 +08:00
    @zhuangzhuang1988 英文能力太差。
    p2p
        10
    p2p  
       2016-12-06 10:55:18 +08:00
    阅读下 tornado 2.* 版本的异步实现的源码
    sujin190
        11
    sujin190  
       2016-12-06 10:58:52 +08:00   ❤️ 1
    Future 简单来说就是一个一个的状态,一连串的 Future 就构成了整个的调用链,类比于函数调用链,区别只是函数是用栈来保存转态的, event loop 监听 io 变更转化为事件通过 yield 的关键字产生的入口变更 Future 状态的变更,转而又引发一连串 Future 状态变更, Future 状态的变更又会产生 io 操作,整个循环就完成了。
    zenliver
        12
    zenliver  
       2016-12-06 11:17:36 +08:00
    ioloop, iostream, gen 看完这 3 个模块源码, 估计用 tornado 不会遇到 hold 不住的问题了
    ansheng
        13
    ansheng  
    OP
       2016-12-06 11:30:42 +08:00
    @zenliver 真的假的
    ansheng
        14
    ansheng  
    OP
       2016-12-06 11:30:58 +08:00
    @sujin190 感觉水好深,
    fy
        15
    fy  
       2016-12-06 11:33:25 +08:00
    看官方文档和 examples ,同时看最新的。
    这个也是改过几次了,看网上文章基本不靠谱的,各种时间段都有,还来回转载。
    jy01264313
        16
    jy01264313  
       2016-12-06 11:49:25 +08:00
    推荐看一下 POSIX 标准 IO
    ansheng
        17
    ansheng  
    OP
       2016-12-06 12:58:39 +08:00
    @fy 如果只是怎么用异步,这个问题倒是不大,主要是他怎么实现异步的,这个就需要特别深入了
    herozem
        18
    herozem  
       2016-12-06 13:00:59 +08:00
    songco
        19
    songco  
       2016-12-06 16:04:23 +08:00
    这块比较简单的我记得是 redis 的网络模块(我当年看的老版本, 新版本应该变化不大).... c 语言的, 有个好处是比较接近底层
    HFcbyqP0iVO5KM05
        20
    HFcbyqP0iVO5KM05  
       2016-12-07 10:26:38 +08:00 via Android
    500 Lines 里面有一个 IO 异步爬虫的实现,把那个读一下可以了解一些基本的东西
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2615 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 11:35 · PVG 19:35 · LAX 04:35 · JFK 07:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.