python腳本請(qǐng)求數(shù)量達(dá)到上限,http請(qǐng)求重試問(wèn)題
python請(qǐng)求數(shù)量達(dá)到上限,http請(qǐng)求重試
由于在內(nèi)網(wǎng)發(fā)送http請(qǐng)求同一個(gè)token會(huì)限制次數(shù),所以很容易達(dá)到網(wǎng)關(guān)流量上限。
業(yè)務(wù)中使用了多線程并發(fā),一個(gè)線程發(fā)起一次http請(qǐng)求,得到正確結(jié)果后返回。
這里采用的策略是,如果解析出來(lái)達(dá)到流量上限,那么該線程休眠一段時(shí)間,然后重試請(qǐng)求,如果還是失敗,那么繼續(xù)休眠,每次休眠的時(shí)間隨著重試輪次增加:
# 探測(cè)是否觸及網(wǎng)關(guān)流量上限
def probe_func(m_url, m_headers, m_json, m_timeout):
json_rep = requests.post(url = m_url,
headers = m_headers,
json = m_json,
timeout = m_timeout)
zhiyan_data = json_rep.json()
if(zhiyan_data['code'] != 0):
return None
else:
return json_rep
# 解析數(shù)據(jù)包,不涉及probe_func中的檢測(cè)內(nèi)容
def parse(json_rep, room_name, metric_name):
if json_rep == None:
logging.info(room_name + " json_rep == None")
return 0
if (json_rep.content and json_rep.status_code != 204 and json_rep.headers["content-type"].strip().startswith("application/json")):
zhiyan_data = json_rep.json()
if len(zhiyan_data['data']) == 0:
logging.warning(zhiyan_data['日志信息拉取無(wú)結(jié)果'])
return 0
else:
res = zhiyan_data['data']['chart_info'][0]['key_data_list'][3]['current']
logging.info(room_name + str(res))
if str(res) == "None":
logging.warning(room_name + ":拉取zhiyan_data:" + metric_name + " 出現(xiàn)了問(wèn)題,拉取數(shù)據(jù)為None")
return 0
else:
return res
else:
return 0
# 具有可靠性地獲取數(shù)據(jù)
def request_post_reliable(m_url, m_headers, m_json, m_timeout):
sleep_time_s = 1
sleep_time_max = 60
res = probe_func(m_url, m_headers, m_json, m_timeout)
# 如果探測(cè)失敗則線程睡眠一段時(shí)間后再嘗試
while (res == None):
logging.info("探測(cè)失敗,線程睡眠"+str(sleep_time_s)+"秒")
time.sleep(sleep_time_s)
tmp = sleep_time_s * 2
if tmp < sleep_time_max:
sleep_time_s = tmp
else:
sleep_time_s = sleep_time_max
logging.info("睡眠結(jié)束,線程重新探測(cè)")
res = probe_func(m_url, m_headers, m_json, m_timeout)
# 直到探測(cè)成功,返回正確結(jié)果
return res
python請(qǐng)求http/https時(shí)設(shè)置失敗重試次數(shù)
使用Python的requests庫(kù)時(shí),默認(rèn)是沒(méi)有失敗時(shí)重試請(qǐng)求的,通過(guò)下面的方式可以支持重試請(qǐng)求
設(shè)置請(qǐng)求時(shí)的重試規(guī)則
import requests
from requests.adapters import HTTPAdapter
s = requests.Session()
a = HTTPAdapter(max_retries=3)
b = HTTPAdapter(max_retries=3)
#將重試規(guī)則掛載到http和https請(qǐng)求
s.mount('http://', a)
s.mount('https://', b)
請(qǐng)求Url
上面設(shè)置完畢后,通過(guò)改Session的請(qǐng)求就可以支持失敗重試
r = s.get('http://api.map.baidu.com/geocoder?location=39.90733345,116.391244079988&output=json')
# 返回的狀態(tài)碼
r.status_code
# 響應(yīng)內(nèi)容,中文為utf8編碼
r.content
# 響應(yīng)的字符串形式,中文為unicode編碼
r.text
# 響應(yīng)頭中的編碼
r.encoding
# 響應(yīng)頭信息
r.headers
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
CentOS6.5設(shè)置Django開(kāi)發(fā)環(huán)境
這篇文章主要為大家詳細(xì)介紹了CentOS6.5設(shè)置Django開(kāi)發(fā)環(huán)境,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
python開(kāi)發(fā)實(shí)例之python使用Websocket庫(kù)開(kāi)發(fā)簡(jiǎn)單聊天工具實(shí)例詳解(python+Websocket+J
這篇文章主要介紹了python開(kāi)發(fā)實(shí)例之python使用Websocket庫(kù)開(kāi)發(fā)簡(jiǎn)單聊天工具實(shí)例詳解(python+Websocket+JS),需要的朋友可以參考下2020-03-03
django 2.0更新的10條注意事項(xiàng)總結(jié)
Django 是 Python Web 開(kāi)發(fā)最常用的框架之一,跟進(jìn)它的最新變化絕對(duì)是必須的。下面這篇文章主要給大家介紹了關(guān)于django 2.0更新的10條注意事項(xiàng),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2018-01-01
anaconda升級(jí)sklearn版本的實(shí)現(xiàn)方法
這篇文章主要介紹了anaconda升級(jí)sklearn版本的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
使用Python圖像處理庫(kù)Pillow處理圖像文件的案例分析
本文將通過(guò)使用Python圖像處理庫(kù)Pillow,幫助大家進(jìn)一步了解Python的基本概念:模塊、對(duì)象、方法和函數(shù)的使用,文中代碼講解的非常詳細(xì),需要的朋友可以參考下2023-07-07

