推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
simple2025
0D
V2EX  ›  Python

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

  •  
  •   simple2025 · Mar 21, 2017 · 2871 views
    This topic created in 3343 days ago, the information mentioned may be changed or developed.
    语言(python)
    现在有这么一种情况。
    
    web 框架 响应 来自客户端的请求的 handler 里面会返回一个列表记录 list1,
    对于 list1 的第一个元素 ele1 要请求 url1,
    list1 的第二个元素 ele2 要请求 url2,
    以此类推,平均一个 url 请求要 200-300ms ,超时调成 1s
    所以如果 list1 的长度为 10 的话,如果迭代请求的话,总时间为 5S 左右。
    你们是怎么处理这种情况的?
    
    
    12 replies    2017-03-22 09:36:24 +08:00
    owt5008137
        1
    owt5008137  
       Mar 21, 2017 via Android
    那就并发请求然后 wait 到所有请求完成呗
    freestyle
        2
    freestyle  
       Mar 21, 2017
    这个时候适合用 tornado 的 ayncHttpClient 啦 http://www.tornadoweb.org/en/stable/httpclient.html#tornado.httpclient.AsyncHTTPClient

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

    参考:[异步多线请求]( https://bb.goiot.cc/uploads/files/1487329416416-flow.png)
    simple2025
        9
    simple2025  
    OP
       Mar 21, 2017
    @librae 效果是你那种效果,难道 golang 也需要中间件来完成这种功能吗
    librae
        10
    librae  
       Mar 21, 2017
    @chenqh 当然不是。这个东东适用于那种需要经常更改的逻辑,如果是写好放在那很久都不会懂它,自然用原生的组件来完成会更漂亮,比如 golang 。
    owt5008137
        11
    owt5008137  
       Mar 21, 2017 via Android
    多线程也行啊
    ansheng
        12
    ansheng  
       Mar 22, 2017
    难道不是 gevent?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3099 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 08:09 · PVG 16:09 · LAX 01:09 · JFK 04:09
    ♥ Do have faith in what you're doing.