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) və 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):Futureobyektinin nəticəsini təyin edir. -
set_exception(exception):Futureobyektinə istisna təyin edir. -
result():Futureobyektinin 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, Task və Future ilə tanış olduqdan sonra, onları daha ətraflı nəzərdən keçirəcəyik.
GO TO FULL VERSION