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

2017-03-21 11:52:52 +08:00
 chenqh
语言(python)
现在有这么一种情况。

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

2429 次点击
所在节点    Python
12 条回复
owt5008137
2017-03-21 12:25:56 +08:00
那就并发请求然后 wait 到所有请求完成呗
freestyle
2017-03-21 12:31:19 +08:00
这个时候适合用 tornado 的 ayncHttpClient 啦 http://www.tornadoweb.org/en/stable/httpclient.html#tornado.httpclient.AsyncHTTPClient

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

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

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

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

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

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

© 2021 V2EX