CodeGym /Kurslar /Python SELF AZ /Tapşırıqlarla və event loop ilə tanışlıq

Tapşırıqlarla və event loop ilə tanışlıq

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

5.1 Event Loop

İndi qısa şəkildə asinxronluğun ikinci hissəsinə toxunaq, hansı ki hər tərəfdən özünü göstərir: hadisələr dövrü (Event Loop), tapşırıqlar (Task)Future.

Event Loop-u orkestrin dirijoru, Task-ı musiqiçilər, Future-u isə musiqiçilərin oxumalı olduğu notlar kimi təsəvvür edin. Dirijor (Event Loop) musiqiçilərin (Task) işini koordinasiya edir, onlar musiqi (asinxron əməliyyatlar) icra edirlər, notları isə (Future) oxuyurlar.

Hadisələr dövrü (Event Loop) Python-da asinxron proqramlaşdırmanın əsasını təşkil edir. O, asinxron tapşırıqların icrasına, hadisələrin idarə edilməsinə və giriş-çıxış əməliyyatlarının işlənməsinə cavabdehdir. Hadisələr dövrü davamlı olaraq yeni hadisələrin və ya tapşırıqların olub-olmamasını yoxlayır və onları hazır olduqca işə salır.

Əsas funksiyalar

  • run_forever(): Hadisələr dövrünü işə salır və stop() çağırılana qədər onun icrasını davam etdirir.
  • run_until_complete(future): Hadisələr dövrünü işə salır və müəyyən gələcək obyektin və ya korutinin tamamlanmasından sonra onu dayandırır.
  • stop(): Hadisələr dövrünü dayandırır.
  • create_task(coroutine): Korutini tapşırıq kimi planlaşdırır.

İstifadə nümunəsi:


import asyncio

async def hello():
    print("Salam, dünya!")
    await asyncio.sleep(1)
    print("Yenidən salam!")
            
loop = asyncio.get_event_loop()
loop.run_until_complete(hello())
loop.close()

Bu nümunədə əvvəlcə get_event_loop() metodundan istifadə edərək asyncio kitabxanasının cari EventLoop obyektini əldə edirik.

Daha sonra həmin EventLoop obyektinə hello korutini əlavə edirik və run_until_complete() metodu vasitəsilə onu icra etməsini istəyirik.

Sonuncu addımda isə close() metodu ilə EventLoop obyektini bağlayırıq.

Bu kodu icra etdikdə əvvəlcə "Salam, dünya!" mətnini görəcəksiniz, sonra proqram 1 saniyə gözləyəcək və daha sonra "Yenidən salam!" mətnini çıxaracaq. Bu, Event Loop-un asinxron funksiyanın icrasını necə idarə etdiyini nümayiş etdirir.

Bu əməliyyatları növbəti mühazirədə ətraflı nəzərdən keçirəcəyik.

5.2 Tasks

Tapşırıqlar (Tasks), korutinlərin icrasını idarə etməyə və onların vəziyyətini izləməyə imkan verən bir obyektdir. Tapşırıqlar vasitəsilə korutinləri paralel icra etmək mümkündür, onların idarə etməsi Event Loop vasitəsilə həyata keçirilir.

Tapşırıqların yaradılması və idarə edilməsi

  • asyncio.create_task(coroutine): Korutini icra etmək üçün tapşırıq yaradır.
  • Task.result(): İcrası tamamlanmış tapşırığın nəticəsini qaytarır və ya əgər səhvlə tamamlanıbsa səhv atır.
  • Task.cancel(): Tapşırığın icrasını dayandırır.

İstifadə nümunəsi:


import asyncio

async def say_hello():
    await asyncio.sleep(1)
    print("Salam")
            
async def main():
    task = asyncio.create_task(say_hello())
    await task
            
asyncio.run(main())

Bu nümunədə biz say_hello() korutini Task obyekti ilə əhatələyirik. Bu da asinxron obyekt sayılır, ona görə də onun nəticəsini almaq üçün await operatorundan istifadə etmək lazımdır.

Bu kod icra olunduqda, proqram 1 saniyə gözləyəcək və sonra "Salam" yazdıracaq. Bu, Task-ın korutinin idarə edilməsini necə həyata keçirdiyini və await vasitəsilə onun tamamlanmasını necə gözləyə biləcəyimizi göstərir.

Tapşırıqlarla (Task) iş haqqında daha ətraflı məlumat növbəti mövzuda veriləcək.

5.3 Futures

Future obyektləri asinxron bir əməliyyatın gələcəkdə əlçatan olacaq nəticəsini təmsil edir. Onlar asinxron əməliyyatın vəziyyətini idarə etməyə imkan verir, nəticəni və ya istisnanı təyin etməyə imkan verir.

Əsas metodlar:

  • set_result(result): Future obyektinin nəticəsini təyin edir.
  • set_exception(exception): Future obyektinə istisna təyin edir.
  • result(): Future obyektinin nəticəsini qaytarır və ya əgər əməliyyat səhvlə tamamlanıbsa, istisna yaradacaq.
  • exception(): Əgər o təyin edilibsə, istisnanı qaytarır.

İstifadə nümunəsi:


import asyncio

async def set_future(fut, value):
    await asyncio.sleep(1)
    fut.set_result(value)
            
async def main():
    loop = asyncio.get_running_loop()
    fut = loop.create_future()
    await set_future(fut, 'Salam, gələcək!')
    print(fut.result())
            
asyncio.run(main())

Bu nümunədə biz Future yaradırıq, onun qiymətini bir saniyə sonra təyin edirik və sonra nəticəni çap edirik. Görəcəksiniz ki, proqram bir saniyə gözləyəcək və sonra 'Salam, gələcək!' çıxışı edəcək. Bu, Future-un gələcəkdə əlçatan olacaq nəticəni necə təmsil etdiyini göstərir.

Task obyektindən fərqli olaraq, Future obyekti konkret bir Event Loop-a bağlanır və yerinə yetirilən asinxron funksiya bunun içinə nəticəsini yaza bilər. Baxmayaraq ki, bu adətən bir az fərqli işləyir.

Ən çox Future obyektləri Task tapşırıqları ilə birləşdirilmiş halda istifadə olunur, bu isə asinxron əməliyyatların daha yüksək səviyyədə idarəsini təmin edir.

İndi Event Loop, TaskFuture ilə tanış olduqdan sonra, onları daha ətraflı nəzərdən keçirəcəyik.

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