一、遇到問題
最近遇到一個小問題 : 發(fā)現(xiàn)我的進(jìn)程在調(diào)某個 API 的時候,不能正常 work 了。
馬上一頓 strace -p pid 操作,定睛一看,
發(fā)現(xiàn)我的進(jìn)程卡在了 recvfrom(23) 不動了,一直不會進(jìn)入 accept 或者 epoll_wait ,
沒有請求響應(yīng),也不會有任何的報錯。
這時候才想起被requests.post 坑了,這貨默認(rèn)是阻塞的,除非顯式指定了 timeout 值,否則不會做超時處理。
二、顯式指定超時和重試
配置 requests 在經(jīng)過 timeout( s )之后停止等待響應(yīng),從而避免進(jìn)程一直卡?。??
try:
? ?requests.adapters.DEFAULT_RETRIES = 2
? ?response = requests.post(url, data = body, headers = http_headers, timeout=5 )
except Exception as ee:
? ?LOGGER.error(ee)
如此配置后,客戶端在 timeout 秒內(nèi)從基礎(chǔ)套接字上必須接收到第一個字節(jié)數(shù)據(jù), 否則就會拋出超時異常,不會再卡住了。
這里為了盡力收到數(shù)據(jù),加了一次重試。
三、timeout 細(xì)化控制
前面配置的 “timeout=5” ,這個值是作為 connect 和 read 二者共用的 timeout ,
可以采用元組方式對這種單值超時方式進(jìn)行細(xì)化,從而支持分別設(shè)置連接和讀取階段的超時時間。
connect 連接超時
指的是客戶端實現(xiàn)到遠(yuǎn)端服務(wù)器端口的連接時 request 所等待的時間。
連接超時一般設(shè)為比 3 的倍數(shù)略大的一個數(shù)值,因為 TCP 數(shù)據(jù)包重傳窗口的默認(rèn)大小是 3。
read 讀取超時
指的客戶端已經(jīng)連接上服務(wù)器并且發(fā)送了 request 后,客戶端等待服務(wù)器發(fā)送請求的時間。
一般指的是服務(wù)器發(fā)送第一個字節(jié)之前的時間。
元組配置方式,比如:
response = requests.post(url, data = body, headers = http_headers, timeout=(3, 1) )
元組 timeout=(3, 1) 內(nèi)第一個值為連接超時時間,第二個值為讀取超時時間:
?
本文轉(zhuǎn)載自:https:///weixin_448216/article/details/105796379