tornado 并行异步,如何保证在只有部分请求成功后,结果依旧可用。

2016-06-30 22:46:47 +08:00
 aiqier

tornado 可以使用如下方式并行异步请求。

@gen.coroutine
def get(self):
    http_client = AsyncHTTPClient()
    response1, response2 = yield [http_client.fetch(url1),
                                  http_client.fetch(url2)]

这个时候, 1,2 是同时发送出去的,也就是说使用这种方式,可以让 n 个请求,同时发出去,等他们都返回了再统一返回。

那么我要如何保证,其中一个请求坏了,其余的结果依旧可用?

9191 次点击
所在节点    Tornado
3 条回复
HFcbyqP0iVO5KM05
2016-07-01 10:51:57 +08:00
你把右边的函数改一下,做一个 `try ... except ...`,保证无论如何函数都有返回。
kinghui
2016-07-01 13:40:52 +08:00
加个 wrapper 包装一下:
```
@gen.croutine
def _proxy(method, *args, **kwargs):
try:
ret = yield method(*args, **kwargs)
except ErrorYourWantCatch:
# logging or something else
ret = None
raise gen.Return(ret)


@gen.coroutine
def get(self):
http_client = AsyncHTTPClient()
response1, response2 = yield [_proxy( http_client.fetch, url1),
_proxy( http_client.fetch, url2)]
```
kinghui
2016-07-01 13:43:15 +08:00

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

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

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

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

© 2021 V2EX