tornado 使用 ThreadPoolExecutor 疑问

2018-12-04 12:51:15 +08:00
 aoscici2000

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

920 次点击
所在节点    问与答
3 条回复
wwqgtxx
2018-12-04 13:14:25 +08:00
Future 的 result 方法是阻塞的,所以你这样就把协程给阻塞了
aoscici2000
2018-12-04 14:38:38 +08:00
@wwqgtxx 那该怎么弄才能让他俩同时干活又不给别人添堵呢?
wwqgtxx
2018-12-04 15:11:18 +08:00
@aoscici2000 其实 python 标准库 asyncio 中 loop 实现了一个 run_in_executor 方法内部就相似的实现,至于 tornado 你可能要自己查文档了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/514168

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX