จำเป็นต้องมีการหมดเวลาเพื่อป้องกัน `requests.get()` จากการบล็อกหรือไม่ หากอินเทอร์เฟซเครือข่ายล่มชั่วคราว

ฉันกำลังพัฒนาแอปพลิเคชัน โดยต้องจัดการกับการตัดการเชื่อมต่อชั่วคราวบนไคลเอนต์ (อินเทอร์เฟซเครือข่ายล่ม)

ตอนแรกฉันคิดว่าวิธีการด้านล่างนี้ใช้ได้ แต่บางครั้งหากรีสตาร์ทอินเทอร์เฟซเครือข่าย การโทร s.get(url) จะหยุดทำงานโดยไม่มีกำหนด:

s = requests.Session()
s.mount('http://stackoverflow.com', HTTPAdapter(max_retries=Retry(total=10, connect=10, read=10)))
s.get(url)

ด้วยการเพิ่มอาร์กิวเมนต์คำหลัก timeout=10 ให้กับ s.get(url) โค้ดจึงสามารถจัดการกับพฤติกรรมการบล็อกนี้ได้แล้ว:

s = requests.Session()
s.mount('http://stackoverflow.com', HTTPAdapter(max_retries=Retry(total=10, connect=10, read=10)))
s.get(url, timeout=10)

เหตุใดการหมดเวลาจึงจำเป็นในการจัดการกรณีที่อินเทอร์เฟซเครือข่ายรีเซ็ตหรือหยุดทำงานชั่วคราว เหตุใด max_retries=Retry(total=10, connect=10, read=10) จึงไม่สามารถจัดการสิ่งนี้ได้ โดยเฉพาะอย่างยิ่ง เหตุใด s.get() จึงไม่ได้รับแจ้งว่าอินเทอร์เฟซเครือข่ายออฟไลน์ เพื่อให้สามารถลองเชื่อมต่ออีกครั้งแทนที่จะหยุดทำงาน


person Shuzheng    schedule 17.04.2020    source แหล่งที่มา


คำตอบ (1)


ลอง: https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html#urllib3.util.retry.Retry

from requests.adapters import HTTPAdapter

s = requests.Session()
s.mount('http://stackoverflow.com', HTTPAdapter(max_retries=5))

Or:

retries = Retry(connect=5, read=2, redirect=5)
http = PoolManager(retries=retries)
response = http.request('GET', 'http://stackoverflow.com')

Or:

response = http.request('GET', 'http://stackoverflow.com', retries=Retry(10))
person Mahsa Hassankashi    schedule 17.04.2020
comment
ฉันไม่เห็นว่าสิ่งนี้ตอบคำถามของฉันได้อย่างไร - person Shuzheng; 18.04.2020