跪着问各位大佬。 Python requests。 当你的请求很多很多的时候 要怎么优化性能 - V2EX
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
nightstart
V2EX    Python

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

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

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

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

    22 条回复    2017-07-03 09:09:13 +08:00
    Morriaty
        1
    Morriaty  
       2017-06-30 16:57:37 +08:00
    本地单独起个 tornado 服务
    每次都请求 localhost:10000/fetch/{ip}/,代码里用 AsyncHttpClient
    ldbC5uTBj11yaeh5
        2
    ldbC5uTBj11yaeh5  
       2017-06-30 16:57:59 +08:00
    gevent + httplib2
    BiggerLonger
        3
    BiggerLonger  
       2017-06-30 17:07:44 +08:00
    直接 gevent spawn 然後 joinall 吧, 要不然直接 python3.6
    tonghuashuai
        4
    tonghuashuai  
       2017-06-30 17:13:59 +08:00
    gevent celery 都可以解决
    Kilerd
        5
    Kilerd  
       2017-06-30 17:30:14 +08:00
    在异步的前提下用 aiorequests
    dbow
        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'
    ```
    AnyISalIn
        7
    AnyISalIn  
       2017-06-30 17:39:46 +08:00 via iPhone
    要么用多线程,要么用协程咯
    kkeybbs
        8
    kkeybbs  
       2017-06-30 17:45:11 +08:00 via Android
    如果同一个域名的比较多,再用上连接池特性来加速
    takato
        9
    takato  
       2017-06-30 17:55:22 +08:00
    看看 treq 这个包?
    yov123456
        10
    yov123456  
       2017-06-30 18:37:12 +08:00 via iPhone
    request_future ?
    ryd994
        11
    ryd994  
       2017-06-30 20:37:42 +08:00
    gevent monkey patch 试试?
    libook
        12
    libook  
       2017-06-30 23:22:43 +08:00 via Android
    去状态化+分布式负载均衡
    nightstart
        13
    nightstart  
    OP
       2017-07-01 00:24:11 +08:00
    @Morriaty 哇 真的是好想法....崭新的思路!
    Ge4Los
        14
    Ge4Los  
       2017-07-01 01:10:27 +08:00
    如果后端是 url 是同一个域名的,用 requests 的 session 长连接,性能会快一点点。
    要不然就用 gevent 和 celery
    lxml
        15
    lxml  
       2017-07-01 08:49:54 +08:00 via Android
    @Ge4Los 实测这个真是聊胜于无,感觉就是每次帮你把 cookie 自动带上的语法糖而已,可能是我使用的方式不对,如果知道具体运作原理还请指教。
    wwqgtxx
        16
    wwqgtxx  
       2017-07-01 09:36:12 +08:00 via iPhone
    @lxml 你要是开启过 debug 日志的话就知道如果是同一个 session 下会保持 keepalive,不会每次访问一个 url 都重新开一个新的短链接
    lxml
        17
    lxml  
       2017-07-01 09:48:32 +08:00 via Android
    @wwqgtxx thanks,我试一下,如果是长链接的话,省去了频繁的握手,按理说效果应该不错啊。
    Ge4Los
        18
    Ge4Los  
       2017-07-01 11:02:50 +08:00
    @lxml requests 的 session 不仅仅是 cookie 保存。 还有个特性是 keepalive 长连接,不用每次都重新建立 tcp 连接。
    110male
        19
    110male  
       2017-07-01 13:08:22 +08:00
    少年,请起,站起来吧
    Huozic
        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 的版本了吗???
    PythonAnswer
        21
    PythonAnswer  
       2017-07-01 22:01:53 +08:00 via Android
    requests 周边生态是 23 兼容的
    nightstart
        22
    nightstart  
    OP
       2017-07-03 09:09:13 +08:00
    @110male 本来跪一下就想起来了 但是看到这么多大神的回复以后。 我已经起不来了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     6178 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 01:57 PVG 09:57 LAX 18:57 JFK 21:57
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86