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

tornado 使用 ThreadPoolExecutor 疑问

  •  
  •   aoscici2000 · 2018-12-04 12:51:15 +08:00 · 1002 次点击
    这是一个创建于 2185 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请教下: 假设我需要执行两次获取数据的操作, 分别需要耗时 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 还是有点蒙

    wwqgtxx
        1
    wwqgtxx  
       2018-12-04 13:14:25 +08:00 via iPhone
    Future 的 result 方法是阻塞的,所以你这样就把协程给阻塞了
    aoscici2000
        2
    aoscici2000  
    OP
       2018-12-04 14:38:38 +08:00 via Android
    @wwqgtxx 那该怎么弄才能让他俩同时干活又不给别人添堵呢?
    wwqgtxx
        3
    wwqgtxx  
       2018-12-04 15:11:18 +08:00 via iPhone
    @aoscici2000 其实 python 标准库 asyncio 中 loop 实现了一个 run_in_executor 方法内部就相似的实现,至于 tornado 你可能要自己查文档了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5584 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 07:53 · PVG 15:53 · LAX 23:53 · JFK 02:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.