pompeii
V2EX  ›  问与答

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

  •  
  •   pompeii · Oct 31, 2019 · 2020 views
    This topic created in 2389 days ago, the information mentioned may be changed or developed.

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

    15 replies    2019-11-10 14:24:56 +08:00
    yxcxx
        1
    yxcxx  
       Oct 31, 2019
    asyncio 不香吗
    pompeii
        2
    pompeii  
    OP
       Oct 31, 2019
    @yxcxx #1 忘记说了,用的 Py2.7,#捂脸
    renmu
        3
    renmu  
       Oct 31, 2019 via Android   ❤️ 1
    grequests
    locoz
        4
    locoz  
       Oct 31, 2019   ❤️ 1
    我记得 Tornado 的官方文档里有个样例,就是用 Tornado 的 HTTP Client 做了个简单的爬虫,你要不看看?
    justfly
        5
    justfly  
       Oct 31, 2019   ❤️ 1
    让 io loop run 起来,你的异步逻辑是跑在 io loop 里面的。
    ifoolish
        6
    ifoolish  
       Oct 31, 2019   ❤️ 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  
       Oct 31, 2019
    前面的空格我替换成了下划线,将就着看吧
    pompeii
        8
    pompeii  
    OP
       Oct 31, 2019
    @renmu #3
    @locoz #4

    我去研究一下
    pompeii
        9
    pompeii  
    OP
       Oct 31, 2019
    @justfly #5 谢谢谢谢,这个信息很有用
    pompeii
        10
    pompeii  
    OP
       Oct 31, 2019
    @ifoolish #6 太感谢了,想要的就是这个
    iPhoneXI
        11
    iPhoneXI  
       Oct 31, 2019 via Android   ❤️ 1
    其实没必要
    用进程池 /线程池
    concurrent.futures
    pompeii
        12
    pompeii  
    OP
       Oct 31, 2019
    @iPhoneXI #11 谢谢,我去研究一下
    coroutine
        13
    coroutine  
       Nov 10, 2019
    @ifoolish 老哥,9102 年了,有必要把 装饰器 + yield + raise 的写法改为 async await return 了。
    ifoolish
        14
    ifoolish  
       Nov 10, 2019 via iPhone   ❤️ 1
    @coroutine 看清楚人家楼主说在用 2.7 嘛
    coroutine
        15
    coroutine  
       Nov 10, 2019
    @ifoolish 嗷没注意看评论抱歉 =。=
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3050 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 08:54 · PVG 16:54 · LAX 01:54 · JFK 04:54
    ♥ Do have faith in what you're doing.