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

2017-06-30 16:52:46 +08:00
 nightstart

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

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

6327 次点击
所在节点    Python
22 条回复
Morriaty
2017-06-30 16:57:37 +08:00
本地单独起个 tornado 服务
每次都请求 localhost:10000/fetch/{ip}/,代码里用 AsyncHttpClient
ldbC5uTBj11yaeh5
2017-06-30 16:57:59 +08:00
gevent + httplib2
BiggerLonger
2017-06-30 17:07:44 +08:00
直接 gevent spawn 然後 joinall 吧, 要不然直接 python3.6
tonghuashuai
2017-06-30 17:13:59 +08:00
gevent celery 都可以解决
Kilerd
2017-06-30 17:30:14 +08:00
在异步的前提下用 aiorequests
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
2017-06-30 17:39:46 +08:00
要么用多线程,要么用协程咯
kkeybbs
2017-06-30 17:45:11 +08:00
如果同一个域名的比较多,再用上连接池特性来加速
takato
2017-06-30 17:55:22 +08:00
看看 treq 这个包?
yov123456
2017-06-30 18:37:12 +08:00
request_future ?
ryd994
2017-06-30 20:37:42 +08:00
gevent monkey patch 试试?
libook
2017-06-30 23:22:43 +08:00
去状态化+分布式负载均衡
nightstart
2017-07-01 00:24:11 +08:00
@Morriaty 哇 真的是好想法....崭新的思路!
Ge4Los
2017-07-01 01:10:27 +08:00
如果后端是 url 是同一个域名的,用 requests 的 session 长连接,性能会快一点点。
要不然就用 gevent 和 celery
lxml
2017-07-01 08:49:54 +08:00
@Ge4Los 实测这个真是聊胜于无,感觉就是每次帮你把 cookie 自动带上的语法糖而已,可能是我使用的方式不对,如果知道具体运作原理还请指教。
wwqgtxx
2017-07-01 09:36:12 +08:00
@lxml 你要是开启过 debug 日志的话就知道如果是同一个 session 下会保持 keepalive,不会每次访问一个 url 都重新开一个新的短链接
lxml
2017-07-01 09:48:32 +08:00
@wwqgtxx thanks,我试一下,如果是长链接的话,省去了频繁的握手,按理说效果应该不错啊。
Ge4Los
2017-07-01 11:02:50 +08:00
@lxml requests 的 session 不仅仅是 cookie 保存。 还有个特性是 keepalive 长连接,不用每次都重新建立 tcp 连接。
110male
2017-07-01 13:08:22 +08:00
少年,请起,站起来吧
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 的版本了吗???🤔

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/372205

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX