V2EX 首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Python

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

  •  
  •   chenqh · 36 天前 · 941 次点击
    这是一个创建于 36 天前的主题,其中的信息可能已经有所发展或是发生改变。
    语言(python)
    现在有这么一种情况。
    
    web 框架 响应 来自客户端的请求的 handler 里面会返回一个列表记录 list1,
    对于 list1 的第一个元素 ele1 要请求 url1,
    list1 的第二个元素 ele2 要请求 url2,
    以此类推,平均一个 url 请求要 200-300ms ,超时调成 1s
    所以如果 list1 的长度为 10 的话,如果迭代请求的话,总时间为 5S 左右。
    你们是怎么处理这种情况的?
    
    
    12 回复  |  直到 2017-03-22 09:36:24 +08:00
        1
    owt5008137   36 天前 via Android
    那就并发请求然后 wait 到所有请求完成呗
        2
    freestyle   36 天前
    这个时候适合用 tornado 的 ayncHttpClient 啦 http://www.tornadoweb.org/en/stable/httpclient.html#tornado.httpclient.AsyncHTTPClient

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

    参考:[异步多线请求]( https://bb.goiot.cc/uploads/files/1487329416416-flow.png)
        9
    chenqh   36 天前
    @librae 效果是你那种效果,难道 golang 也需要中间件来完成这种功能吗
        10
    librae   36 天前
    @chenqh 当然不是。这个东东适用于那种需要经常更改的逻辑,如果是写好放在那很久都不会懂它,自然用原生的组件来完成会更漂亮,比如 golang 。
        11
    owt5008137   36 天前 via Android
    多线程也行啊
        12
    ansheng   35 天前
    难道不是 gevent?
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   629 人在线   最高记录 2466   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.7.5 · 56ms · UTC 23:19 · PVG 07:19 · LAX 16:19 · JFK 19:19
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1