使用Python进行网络编程时,常使用requests模块进行http接口调用。如果只是很少的接口调用,使用常规的requests.post()
或 requests.get()
就可以满足要求。但是如果涉及到很多次接口调用,那可能会遇到程序执行时间长的效率问题。为提高程序执行效率,降低服务端压力,可以考虑的一个思路是使用长连接,节省频繁的tcp连接握手和挥手的过程。
PS:处于信息敏感,url做了屏蔽
优化前
def q_inst(obj_id='host', field='bk_host_innerip', value=''):
headers = {"Content-Type": "application/json"}
data = {
"bk_obj_id": obj_id,
"bk_supplier_account": "0",
"page": {
"start": 0,
"limit": 10
},
"condition": {
obj_id: [{
"field": field,
"operator": "$eq",
"value": value
}]
}
}
res_p = requests.post('https://***.***.***/api/c/compapi/v2/cc/search_inst/', data =data, headers = headers)
return res_p
if __name__ == '__main__':
for in range(4001):
res = q_inst(value='10.1.1.1')
#################output##########################
查询蓝鲸接口共耗时:0:09:03.148451
优化后
def keep_alive():
"""
实例化一个长连接对象
:return:
"""
s = requests.Session()
return s
def q_inst(func, obj_id='host', field='bk_host_innerip', value=''):
headers = {"Content-Type": "application/json"}
data = {
"bk_obj_id": obj_id,
"bk_supplier_account": "0",
"page": {
"start": 0,
"limit": 10
},
"condition": {
obj_id: [{
"field": field,
"operator": "$eq",
"value": value
}]
}
}
res_p = func.post('https://***.***.***/api/c/compapi/v2/cc/search_inst/', data = data, headers = headers)
return res_p
if __name__ == '__main__':
s = keep_alive()
for in range(4001):
res = q_inst(s, value='10.1.1.1')
#################output##########################
查询蓝鲸接口共耗时:0:03:21.099682
总结:
以上范例中,由于上下游系统的keep_alive超时限制是5秒,如果时间拉长的话,执行效率将进一步提升。
官方范例:
Basic Usage::
>>> import requests
>>> s = requests.Session()
>>> s.get('https://httpbin.org/get')
<Response [200]>
Or as a context manager::
>>> with requests.Session() as s:
... s.get('https://httpbin.org/get')
<Response [200]>
"""