语言(python)
现在有这么一种情况。
web 框架 响应 来自客户端的请求的 handler 里面会返回一个列表记录 list1,
对于 list1 的第一个元素 ele1 要请求 url1,
list1 的第二个元素 ele2 要请求 url2,
以此类推,平均一个 url 请求要 200-300ms ,超时调成 1s
所以如果 list1 的长度为 10 的话,如果迭代请求的话,总时间为 5S 左右。
你们是怎么处理这种情况的?
语言(python)
现在有这么一种情况。
web 框架 响应 来自客户端的请求的 handler 里面会返回一个列表记录 list1,
对于 list1 的第一个元素 ele1 要请求 url1,
list1 的第二个元素 ele2 要请求 url2,
以此类推,平均一个 url 请求要 200-300ms ,超时调成 1s
所以如果 list1 的长度为 10 的话,如果迭代请求的话,总时间为 5S 左右。
你们是怎么处理这种情况的?
1
owt5008137 Mar 21, 2017 via Android
那就并发请求然后 wait 到所有请求完成呗
|
2
freestyle Mar 21, 2017
这个时候适合用 tornado 的 ayncHttpClient 啦 http://www.tornadoweb.org/en/stable/httpclient.html#tornado.httpclient.AsyncHTTPClient
接受传入 loop, 非 tornado 框架也可以使用 比如 |
3
simple2025 OP @owt5008137 用 multiprocess?
|
4
windfarer Mar 21, 2017 via Android
gevent 的话用 grequests
|
5
HFcbyqP0iVO5KM05 Mar 21, 2017 via Android
如果你的框架是 tornado , 可以用它的 AsyncHttpClient
如果你的框架是 flask ,把这些 url 请求任务丢到 celery ,把请求情况保存到 redis ,所有请求都完成了再回调 |
6
Finest Mar 21, 2017
并发请求之后合并结果
|
7
vjnjc Mar 21, 2017
如果是因为网慢或者 response 大的话。。。即使请求并发了,结果还是快不起来
|
8
librae Mar 21, 2017 via iPhone
这种情况的话,我们一般用这个 [Go.IoT]( https://goiot.cc) 做一个中间件,
可以同时触发多个 http 请求,全都完成后执行下一步。 参考:[异步多线请求]( https://bb.goiot.cc/uploads/files/1487329416416-flow.png) |
9
simple2025 OP @librae 效果是你那种效果,难道 golang 也需要中间件来完成这种功能吗
|
11
owt5008137 Mar 21, 2017 via Android
多线程也行啊
|
12
ansheng Mar 22, 2017
难道不是 gevent?
|