Apakah batas waktu diperlukan untuk mencegah pemblokiran `requests.get()`, jika antarmuka jaringan mati sementara?

Saya telah mengembangkan sebuah aplikasi, di mana saya perlu menangani pemutusan sementara pada klien (antarmuka jaringan mati).

Awalnya saya mengira pendekatan di bawah ini akan berhasil, tetapi terkadang jika memulai ulang antarmuka jaringan, panggilan s.get(url) akan terhenti tanpa batas waktu:

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

Dengan menambahkan argumen kata kunci timeout=10 ke s.get(url), kode kini mampu menangani perilaku pemblokiran ini:

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

Mengapa batas waktu diperlukan untuk menangani kasus-kasus di mana antarmuka jaringan direset atau mati sementara? Mengapa max_retries=Retry(total=10, connect=10, read=10) tidak mampu menangani ini? Secara khusus, mengapa s.get() tidak diberitahu bahwa antarmuka jaringan menjadi offline, sehingga dapat mencoba kembali sambungan alih-alih terhenti?


person Shuzheng    schedule 17.04.2020    source sumber


Jawaban (1)


Coba: 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
Saya tidak begitu mengerti bagaimana ini menjawab pertanyaan saya? - person Shuzheng; 18.04.2020