CodeGym /Kurslar /Python SELF AZ /Retry və timeout'lar skriptin davamlılığı üçün

Retry və timeout'lar skriptin davamlılığı üçün

Python SELF AZ
Səviyyə , Dərs
Mövcuddur

1. Skriptlərdə səhvlərin idarə edilməsi

Veb-skreyping problemləri

Təsəvvür edin: skriptiniz belə gözəl, işləməyə hazır oturub, amma qəfildən banan qabığına sürüşür — və budur! Səhvlər və yıxılmalar. Necə edək ki, o, İnternetin çətin şəraitlərində sağ qalsın? Bu gün biz onun iki vacib bacarığını öyrədəcəyik: dözüm və yenidən cəhd etmə. Bəli, bəli, biz retry və timeout'lar tənzimləyəcəyik.

Veb-skreyping ilə işləmək əladır, ta ki, skriptiniz qəfildən aşağıdakı səbəblərə görə dayanmayınca:

  • Baqlantı problemləri.
  • Serverlərin müvəqqəti əlçatmazlığı.
  • Səhifələrin HTML strukturunda gözlənilməz dəyişikliklər.

Skriptiniz, sanki cəngavər kimi, gözlənilməzliyə hazır olmalı və onlarla necə mübarizə aparmağı bacarmalıdır. Bəzən problemləri sadəcə bir dəqiqə gözləyib sorğunu təkrarlamaqla həll etmək olar. Və burada bizim qəhrəmanlarımız — retry və timeout'lar meydana çıxır!

Səhvlərin idarəetmə mexanizmlərinə giriş

Əvvəlcə gəlin əsasları xatırlayaq — Python-da səhvlərin idarə edilməsi. Biz try-except bloklarından istifadə edərək səhvləri idarə edirik və skriptimizə mane olmalarının qarşısını alırıq.

Python

import requests

try:
    response = requests.get('https://example.com')
    response.raise_for_status()  # sorğunun uğurluluğunu yoxlama
except requests.exceptions.RequestException as e:
    print(f'Bir səhv baş verdi: {e}')

2. Retry qurulması

Niyə yenidən cəhdlərdən istifadə etməliyik?

İlk uğursuzluqda təslim olan skript, güclü yağışdan qorxan pişik kimidir. Lakin sənə bir neçə maneəni cəsarətlə keçən bir skript lazımdır. Məhz buna görə də biz retry-ləri konfiqurasiya edirik — beləliklə, skript daha özündən əmin olur.

Yenidən cəhdləri necə qurmaq olar

İndi gəlin yenidən cəhdləri necə təşkil edə biləcəyimizi müzakirə edək. Ən sadə yollarından biri urllib3 kitabxanasından istifadə etməkdir, hansı ki, səhv baş verdikdə avtomatik olaraq sorğunu yenidən göndərmək funksionallığını təmin edir.

Python

from urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter
import requests

session = requests.Session()
retries = Retry(total=5, backoff_factor=1, status_forcelist=[500, 502, 503, 504])
session.mount('https://', HTTPAdapter(max_retries=retries))

try:
    response = session.get('https://example.com')
    response.raise_for_status()
    print(response.content)
except requests.exceptions.RequestException as e:
    print(f'Xəta baş verdi: {e}')

Bu nümunədə biz session yaratdıq, hansı ki, retry mexanizmini (Retry) tətbiq etdik. Biz dedik ki, 500, 502, 503 və 504 kodları ilə baş verən uğursuzluqları 5 dəfəyə qədər etmək olar. backoff_factor=1 isə o deməkdir ki, cəhdlər arasındakı vaxt eksponensial artım prinsipinə əsasən artırılacaq (1, 2, 4, 8... saniyə).

3. Timeout: Donmaların qarşısını alma

Gözləməyə səbri olmayanlar üçün

Timeout — sanki bir zəngli saatdır: serverin cavabını gözləyərkən donmamaq üçün kömək edir. Timeout təyin edərkən, skriptinizə belə deyirsiniz: "Bu qədər kifayətdir! Əgər server göstərilən müddət ərzində cavab verməzsə, davam et!"

Python

try:
    response = requests.get('https://example.com', timeout=10)
    response.raise_for_status()
    print(response.content)
except requests.exceptions.Timeout:
    print('Sorğu gözləmə vaxtını keçdi')
except requests.exceptions.RequestException as e:
    print(f'Xəta baş verdi: {e}')

Bunun nə faydası var?

Heç skriptinizin serverdən cavab gözləyərkən donub qaldığını görmüsünüzmü? Timeout lazımsız gözləmələrin qarşısını alır və kodunuza tez bir şəkildə özünü bərpa edib işə davam etməyə imkan verir. Skriptinizə "Hələ də buna dəyər?" dedirtməyin – o, bu vaxt ərzində bir neçə siqaret çəkə bilərdi!

4. Parametrlərin nümunələri

Retry istifadəsilə sabit skriptin implementasiyası

İndi gəlin bizim skripti yığaq. O, dəmir adamın zirehi qədər sabit olacaq. Timeout və retry-lərdən istifadə edəcəyik.

Python

from urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter
import requests

def fetch_url(url):
    session = requests.Session()
    retries = Retry(total=5, backoff_factor=1, status_forcelist=[500, 502, 503, 504])
    session.mount('https://', HTTPAdapter(max_retries=retries))

    try:
        response = session.get(url, timeout=10)
        response.raise_for_status()
        return response.content
    except requests.exceptions.Timeout:
        print('Sorğu gözləmə vaxtını keçdi')
    except requests.exceptions.RequestException as e:
        print(f'Xəta baş verdi: {e}')
    return None

content = fetch_url('https://example.com')
if content:
    print('Məlumatları uğurla yüklədik!')

Skriptin donmasının qarşısını almaq üçün timeout istifadəsi

Artıq timeout-ları necə təyin edəcəyimizi göstərdik. İndi əmin olaq ki, skriptimiz sadəcə sabit deyil, həm də uzun gözləmələrə ağıllı reaksiya verir. "Donmaq" əvəzinə, sadəcə sahibinə xəbər verir: "Hey, server çox uzun düşünür, mən gözləməyəcəm!"

Bu cür sadə və qısa yanaşma kodunuzu etibarlı edəcək və internetdə baş verə biləcək gözlənilməz vəziyyətlərə hazır olacaq.

Praktik tətbiq

Real scraping layihələri hazırlayanda tez-tez serverlərin müxtəlif məhdudiyyətləri ilə qarşılaşırsınız. Retry və timeout-lar sizin kod işləməsinin dayanmaması üçün ən yaxşı dostlarınızdır. Bu üsullar, xüsusilə məlumatların avtomatik işlənməsi zamanı və vaxtında dəqiq nəticələr əldə etmək üçün vacib olanda, kodunuzu daimi işlək vəziyyətdə saxlamağa kömək edir. Bu texnikalar həmçinin sizin CV-nizi gücləndirə bilər və məlumat təqdim etdiyiniz müştərilərin inamını artırar.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION