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