V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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
chenqh
V2EX  ›  Python

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

  •  
  •   chenqh · 2017-03-21 11:52:52 +08:00 · 2332 次点击
    这是一个创建于 2592 天前的主题,其中的信息可能已经有所发展或是发生改变。
    语言(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
    owt5008137
        1
    owt5008137  
       2017-03-21 12:25:56 +08:00 via Android
    那就并发请求然后 wait 到所有请求完成呗
    freestyle
        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 框架也可以使用
    比如
    chenqh
        3
    chenqh  
    OP
       2017-03-21 12:31:51 +08:00
    @owt5008137 用 multiprocess?
    windfarer
        4
    windfarer  
       2017-03-21 12:45:16 +08:00 via Android
    gevent 的话用 grequests
    gulu
        5
    gulu  
       2017-03-21 12:53:35 +08:00 via Android
    如果你的框架是 tornado , 可以用它的 AsyncHttpClient
    如果你的框架是 flask ,把这些 url 请求任务丢到 celery ,把请求情况保存到 redis ,所有请求都完成了再回调
    hand515
        6
    hand515  
       2017-03-21 13:13:14 +08:00
    并发请求之后合并结果
    vjnjc
        7
    vjnjc  
       2017-03-21 13:32:42 +08:00
    如果是因为网慢或者 response 大的话。。。即使请求并发了,结果还是快不起来
    librae
        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)
    chenqh
        9
    chenqh  
    OP
       2017-03-21 14:22:12 +08:00
    @librae 效果是你那种效果,难道 golang 也需要中间件来完成这种功能吗
    librae
        10
    librae  
       2017-03-21 15:33:23 +08:00
    @chenqh 当然不是。这个东东适用于那种需要经常更改的逻辑,如果是写好放在那很久都不会懂它,自然用原生的组件来完成会更漂亮,比如 golang 。
    owt5008137
        11
    owt5008137  
       2017-03-21 19:35:53 +08:00 via Android
    多线程也行啊
    ansheng
        12
    ansheng  
       2017-03-22 09:36:24 +08:00
    难道不是 gevent?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5359 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 07:47 · PVG 15:47 · LAX 00:47 · JFK 03:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.