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

如何在脚本里使用 Tornado 的异步

  •  
  •   pompeii · 2019-10-31 16:11:20 +08:00 · 1208 次点击
    这是一个创建于 1632 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在有一个简单的脚本,但是其中有几个操作(发送 HTTP 请求并等待响应)比较耗时,有办法用 Tornado 的异步做嘛?如果有的话,应该如何做(之前看的使用异步的例子,都是把 Tornado 作为 web 服务器,现在我只想在脚本里用)?还是应该用 gevent ?或者 Celery ?

    15 条回复    2019-11-10 14:24:56 +08:00
    yxcxx
        1
    yxcxx  
       2019-10-31 16:46:51 +08:00
    asyncio 不香吗
    pompeii
        2
    pompeii  
    OP
       2019-10-31 16:47:58 +08:00
    @yxcxx #1 忘记说了,用的 Py2.7,#捂脸
    renmu
        3
    renmu  
       2019-10-31 16:50:56 +08:00 via Android   ❤️ 1
    grequests
    locoz
        4
    locoz  
       2019-10-31 17:12:02 +08:00   ❤️ 1
    我记得 Tornado 的官方文档里有个样例,就是用 Tornado 的 HTTP Client 做了个简单的爬虫,你要不看看?
    justfly
        5
    justfly  
       2019-10-31 17:21:44 +08:00   ❤️ 1
    让 io loop run 起来,你的异步逻辑是跑在 io loop 里面的。
    ifoolish
        6
    ifoolish  
       2019-10-31 19:23:18 +08:00   ❤️ 1
    from tornado.ioloop import IOLoop
    from tornado.httpclient import AsyncHTTPClient
    from tornado.gen import coroutine, Return


    @coroutine
    def get_data():
    ____http_client = AsyncHTTPClient()
    ____rsp = yield http_client.fetch(
    ________'http://httpbin.org/ip',
    ________method='GET'
    ____)

    ____body = rsp.body
    ____raise Return(body)


    if __name__ == "__main__":
    ____loop = IOLoop.current()
    ____result = loop.run_sync(get_data)
    ____print result
    ifoolish
        7
    ifoolish  
       2019-10-31 19:24:33 +08:00
    前面的空格我替换成了下划线,将就着看吧
    pompeii
        8
    pompeii  
    OP
       2019-10-31 20:02:14 +08:00
    @renmu #3
    @locoz #4

    我去研究一下
    pompeii
        9
    pompeii  
    OP
       2019-10-31 20:02:39 +08:00
    @justfly #5 谢谢谢谢,这个信息很有用
    pompeii
        10
    pompeii  
    OP
       2019-10-31 20:03:11 +08:00
    @ifoolish #6 太感谢了,想要的就是这个
    iPhoneXI
        11
    iPhoneXI  
       2019-10-31 20:03:40 +08:00 via Android   ❤️ 1
    其实没必要
    用进程池 /线程池
    concurrent.futures
    pompeii
        12
    pompeii  
    OP
       2019-10-31 20:09:24 +08:00
    @iPhoneXI #11 谢谢,我去研究一下
    coroutine
        13
    coroutine  
       2019-11-10 10:23:18 +08:00
    @ifoolish 老哥,9102 年了,有必要把 装饰器 + yield + raise 的写法改为 async await return 了。
    ifoolish
        14
    ifoolish  
       2019-11-10 14:05:05 +08:00 via iPhone   ❤️ 1
    @coroutine 看清楚人家楼主说在用 2.7 嘛
    coroutine
        15
    coroutine  
       2019-11-10 14:24:56 +08:00
    @ifoolish 嗷没注意看评论抱歉 =。=
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1830 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 16:24 · PVG 00:24 · LAX 09:24 · JFK 12:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.