web 框架里面并发请求多个外部 url 怎么办?

2017 年 3 月 21 日
 simple2025
语言(python)
现在有这么一种情况。

web 框架 响应 来自客户端的请求的 handler 里面会返回一个列表记录 list1,
对于 list1 的第一个元素 ele1 要请求 url1,
list1 的第二个元素 ele2 要请求 url2,
以此类推,平均一个 url 请求要 200-300ms ,超时调成 1s
所以如果 list1 的长度为 10 的话,如果迭代请求的话,总时间为 5S 左右。
你们是怎么处理这种情况的?

3054 次点击
所在节点    Python
12 条回复
owt5008137
2017 年 3 月 21 日
那就并发请求然后 wait 到所有请求完成呗
freestyle
2017 年 3 月 21 日
这个时候适合用 tornado 的 ayncHttpClient 啦 http://www.tornadoweb.org/en/stable/httpclient.html#tornado.httpclient.AsyncHTTPClient

接受传入 loop, 非 tornado 框架也可以使用
比如
simple2025
2017 年 3 月 21 日
@owt5008137 用 multiprocess?
windfarer
2017 年 3 月 21 日
gevent 的话用 grequests
HFcbyqP0iVO5KM05
2017 年 3 月 21 日
如果你的框架是 tornado , 可以用它的 AsyncHttpClient
如果你的框架是 flask ,把这些 url 请求任务丢到 celery ,把请求情况保存到 redis ,所有请求都完成了再回调
Finest
2017 年 3 月 21 日
并发请求之后合并结果
vjnjc
2017 年 3 月 21 日
如果是因为网慢或者 response 大的话。。。即使请求并发了,结果还是快不起来
librae
2017 年 3 月 21 日
这种情况的话,我们一般用这个 [Go.IoT]( https://goiot.cc) 做一个中间件,
可以同时触发多个 http 请求,全都完成后执行下一步。

参考:[异步多线请求]( https://bb.goiot.cc/uploads/files/1487329416416-flow.png)
simple2025
2017 年 3 月 21 日
@librae 效果是你那种效果,难道 golang 也需要中间件来完成这种功能吗
librae
2017 年 3 月 21 日
@chenqh 当然不是。这个东东适用于那种需要经常更改的逻辑,如果是写好放在那很久都不会懂它,自然用原生的组件来完成会更漂亮,比如 golang 。
owt5008137
2017 年 3 月 21 日
多线程也行啊
ansheng
2017 年 3 月 22 日
难道不是 gevent?

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

https://v2ex.ih06.com/t/349083

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

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

© 2021 V2EX