首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
V2EX  ›  Python

跪着问各位大佬。 Python requests。 当你的请求很多很多的时候 要怎么优化性能

  •  
  •   nightstart · 2017-06-30 16:52:46 +08:00 · 3200 次点击
    这是一个创建于 688 天前的主题,其中的信息可能已经有所发展或是发生改变。

    网上有 grequests 库 但是有限制 。只能把所有的 url 拉出来一起请求、 我们的项目里要请求各种 url 并且是在不同代码块儿。 做不到拉出来一块儿请求 请问各位 python 网络编程的大佬 能不能支支招。

    梦想中的场景 -- > 像 requests 一样的简单 但是是异步的。(就开开玩笑)

    22 回复  |  直到 2017-07-03 09:09:13 +08:00
        1
    Morriaty   2017-06-30 16:57:37 +08:00
    本地单独起个 tornado 服务
    每次都请求 localhost:10000/fetch/{ip}/,代码里用 AsyncHttpClient
        2
    jigloo   2017-06-30 16:57:59 +08:00
    gevent + httplib2
        3
    BiggerLonger   2017-06-30 17:07:44 +08:00
    直接 gevent spawn 然後 joinall 吧, 要不然直接 python3.6
        4
    tonghuashuai   2017-06-30 17:13:59 +08:00
    gevent celery 都可以解决
        5
    Kilerd   2017-06-30 17:30:14 +08:00
    在异步的前提下用 aiorequests
        6
    dbow   2017-06-30 17:34:45 +08:00
    要不试试我的库 https://github.com/maliubiao/simple_http
    还能控制并发量, 超时时间
    ### 异步方式
    ```shell

    In [21]: def print_it(x):
    import pprint
    ....: pprint.pprint(x)
    ....:

    In [22]: async_http.repeat_tasks([{"url": "http://www.baidu.com", "parser": print_it}])
    {'chain': None,
    'chain_idx': 0,
    'con': <socket._socketobject object at 0x2812bb0>,
    'fd': 5,
    'header_only': False,
    'parser': <function print_it at 0x283da28>,
    'proxy': '',
    'random': '60804c2a0b053fbd',
    'recv': <cStringIO.StringO object at 0x283a3e8>,
    'redirect': 0,
    'res_cookie': {'BAIDUID': {'domain': '.baidu.com',
    'expires': 'Thu, 31-Dec-37 23:55:55 GMT',
    'max-age': '2147483647',
    'path': '/',
    'value': 'BCB0BBBB4312D00C88BCDC9EEAAE3726:FG=1'},
    'BD_LAST_QID': {'Max-Age': '1',
    'path': '/',
    'value': '16069052107084303783'},
    'BIDUPSID': {'domain': '.baidu.com',
    'expires': 'Thu, 31-Dec-37 23:55:55 GMT',
    'max-age': '2147483647',
    'path': '/',
    'value': 'BCB0BBBB4312D00C88BCDC9EEAAE3726'}},
    'res_header': {'Connection': 'Keep-Alive',
    'Content-Length': '215',
    'Content-Type': 'text/html',
    'Date': 'Thu, 21 May 2015 15:50:43 GMT',
    'Location': 'https://www.baidu.com/',
    'P3P': 'CP=" OTI DSP COR IVA OUR IND COM "',
    'Server': 'BWS/1.1',
    'Set-Cookie': 'BAIDUID=BCB0BBBB4312D00C88BCDC9EEAAE3726:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com\r\nBIDUPSID=BCB0BBBB4312D00C88BCDC9EEAAE3726; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com\r\nBD_LAST_QID=16069052107084303783; path=/; Max-Age=1',
    'X-UA-Compatible': 'IE=Edge,chrome=1'},
    'res_status': {'message': 'Moved Temporarily',
    'protocol': 'HTTP/1.1',
    'status': 302},
    'retry': 0,
    'send': <cStringIO.StringO object at 0x25fb8f0>,
    'ssl': False,
    'start': 1432223278.489937,
    'status': 512,
    'text': '<html>\r\n<head><title>302 Found</title></head>\r\n<body bgcolor="white">\r\n<center><h1>302 Found</h1></center>\r\n<hr><center>pr-nginx_1-0-221_BRANCH Branch\nTime : Wed May 20 10:35:46 CST 2015</center>\r\n</body>\r\n</html>\r\n',
    'url': 'http://www.baidu.com'}
    async_http Thu May 21 23:47:58 2015: 'acnt: 1, fcnt: 0, time: 0'
    ```
        7
    AnyISalIn   2017-06-30 17:39:46 +08:00 via iPhone
    要么用多线程,要么用协程咯
        8
    kkeybbs   2017-06-30 17:45:11 +08:00 via Android
    如果同一个域名的比较多,再用上连接池特性来加速
        9
    takato   2017-06-30 17:55:22 +08:00
    看看 treq 这个包?
        10
    yov123456   2017-06-30 18:37:12 +08:00 via iPhone
    request_future ?
        11
    ryd994   2017-06-30 20:37:42 +08:00
    gevent monkey patch 试试?
        12
    libook   2017-06-30 23:22:43 +08:00 via Android
    去状态化+分布式负载均衡
        13
    nightstart   2017-07-01 00:24:11 +08:00
    @Morriaty 哇 真的是好想法....崭新的思路!
        14
    Ge4Los   2017-07-01 01:10:27 +08:00
    如果后端是 url 是同一个域名的,用 requests 的 session 长连接,性能会快一点点。
    要不然就用 gevent 和 celery
        15
    lxml   2017-07-01 08:49:54 +08:00 via Android
    @Ge4Los 实测这个真是聊胜于无,感觉就是每次帮你把 cookie 自动带上的语法糖而已,可能是我使用的方式不对,如果知道具体运作原理还请指教。
        16
    wwqgtxx   2017-07-01 09:36:12 +08:00 via iPhone
    @lxml 你要是开启过 debug 日志的话就知道如果是同一个 session 下会保持 keepalive,不会每次访问一个 url 都重新开一个新的短链接
        17
    lxml   2017-07-01 09:48:32 +08:00 via Android
    @wwqgtxx thanks,我试一下,如果是长链接的话,省去了频繁的握手,按理说效果应该不错啊。
        18
    Ge4Los   2017-07-01 11:02:50 +08:00
    @lxml requests 的 session 不仅仅是 cookie 保存。 还有个特性是 keepalive 长连接,不用每次都重新建立 tcp 连接。
        19
    110male   2017-07-01 13:08:22 +08:00
    少年,请起,站起来吧
        20
    Huozic   2017-07-01 16:52:38 +08:00
    requests 的 session 是 keepalive 的,通过传递 session 的方式可以多个请求共享 TCP 连接。
    其次,文档就有提到: http://docs.python-requests.org/en/master/user/advanced/#blocking-or-non-blocking

    最后,现在问 Python 的问题已经不用带上 Python 的版本了吗???🤔
        21
    PythonAnswer   2017-07-01 22:01:53 +08:00 via Android
    requests 周边生态是 23 兼容的
        22
    nightstart   2017-07-03 09:09:13 +08:00
    @110male 本来跪一下就想起来了 但是看到这么多大神的回复以后。 我已经起不来了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2417 人在线   最高记录 5043   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 20ms · UTC 12:38 · PVG 20:38 · LAX 05:38 · JFK 08:38
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1