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

tornado 使用 ThreadPoolExecutor 疑问

  •  
  •   aoscici2000 · 349 天前 · 446 次点击
    这是一个创建于 349 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请教下: 假设我需要执行两次获取数据的操作, 分别需要耗时 5 秒和 10 秒, 也需要等待返回结果才继续处理, 要怎么弄?

    class GetDataHandler(BaseHandler):
        executor = ThreadPoolExecutor(2)
    
        @tornado.web.asynchronous
        @tornado.gen.coroutine
        def get(self):
            t1 = self.executor.submit(self.get_something, self, 'url-1')
            t2 = self.executor.submit(self.get_something, self, 'url-2')
            data_1 = yield t1.result()
            data_2 = yield t2.result()
            ...
            self.write('OK')
    
        @run_on_executor
        def get_something(self, url):
        	print('start...')
            data = requests.get(url)
            return data
    

    堵倒是不堵了, 也可以同时开始, 但返回结果就要 15 秒的样? 这个 yield 还是有点蒙

        1
    wwqgtxx   349 天前 via iPhone
    Future 的 result 方法是阻塞的,所以你这样就把协程给阻塞了
        2
    aoscici2000   348 天前 via Android
    @wwqgtxx 那该怎么弄才能让他俩同时干活又不给别人添堵呢?
        3
    wwqgtxx   348 天前 via iPhone
    @aoscici2000 其实 python 标准库 asyncio 中 loop 实现了一个 run_in_executor 方法内部就相似的实现,至于 tornado 你可能要自己查文档了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4125 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 25ms · UTC 05:54 · PVG 13:54 · LAX 21:54 · JFK 00:54
    ♥ Do have faith in what you're doing.