Dalam python, perpustakaan urllib3 menggunakan Socket untuk berkomunikasi dengan rangkaianpelayan. Apabila sambungan rangkaian tamat masa, urllib3 mungkin membuang pengecualian socket.timeout("recv timed out"). Ini biasanya kerana pelanggan menunggu terlalu lama untuk respons daripada pelayan, atau pelayan tidak bertindak balas tepat pada masanya. Ia juga mungkin sambungan terputus kerana masalah rangkaian.
Terdapat beberapa cara untuk menyelesaikan masalah ini, bergantung kepada puncanya.
Tingkatkan tamat masa: Anda boleh meningkatkan tamat masa urllib3 supaya ia akan menunggu lebih lama untuk pelayan bertindak balas.
Semak sambungan rangkaian: Semak sama ada sambungan rangkaian stabil Jika ia tidak stabil, anda mungkin perlu menghubungi pembekal perkhidmatan untuk menyelesaikan masalah.
Dasar Cuba Semula: Anda boleh menggunakan modul Cuba Semula untuk mencuba semula permintaan dan cuba semula secara automatik apabila permintaan gagal, dengan itu mengelakkan tamat masa yang disebabkan oleh masalah rangkaian.
Semak bahagian pelayan: Semak sama ada pelayan berjalan dengan betul, jika ia sibuk atau tidak tersedia, anda mungkin perlu menghubungi pentadbir pelayan untuk menyelesaikan masalah.
Mekanisme percubaan semula tamat masa ditambah: cuba semula beberapa kali semasa permintaan untuk mengelakkan tamat masa yang disebabkan oleh masalah rangkaian.
Ya, berikut ialah beberapa contoh kod menggunakan perpustakaan urllib3, yang termasuk cara menyelesaikan pengecualian socket.timeout("recv timed out").
Tingkatkan tamat masa:
import urllib3 Http = urllib3.PoolManager(timeout=30.0) response = http.request('GET', 'http://httpbin.org/get') print(response.data)
Dalam contoh ini, kami menetapkan tamat masa kepada 30 saat.
Polisi Cuba Semula
import urllib3 from urllib3.util.retry import Retry retry = Retry(total=5, backoff_factor=0.1, status_forcelist=[ 500, 502, 503, 504 ]) http = urllib3.PoolManager(retries=retry) response = http.request('GET', 'http://httpbin.org/get') print(response.data)
Dalam contoh ini, kami menetapkan jumlah bilangan percubaan semula kepada 5, faktor cuba semula kepada 0.1 dan kod status cuba semula kepada 500, 502, 503, 504
Cuba semula tamat masa
import urllib3 from urllib3.util.retry import Retry from urllib3.exceptions import ConnectTimeoutError, ReadTimeoutError retry = Retry(total=5, backoff_factor=0.1, status_forcelist=[ 500, 502, 503, 504 ]) http = urllib3.PoolManager(retries=retry) for i in range(5): try: response = http.request('GET', 'http://httpbin.org/get') except ConnectTimeoutError as e: print("ConnectTimeoutError: ", e) except ReadTimeoutError as e: print("ReadTimeoutError: ", e) else: print(response.data) break
Dalam contoh ini, kami menetapkan jumlah bilangan percubaan semula kepada 5, faktor cuba semula kepada 0.1 dan kod status cuba semula kepada 500, 502, 503, 504 dan cuba semula sambil menangkap ConnectTimeoutError dan ReadTimeoutError.
Di atas adalah beberapa contoh kod, saya harap ia dapat membantu anda menyelesaikan masalah tersebut.
Atas ialah kandungan terperinci Penyelesaian kepada ralat urllib3 socket.timeout(\'recv timed out\'). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!