6.1 Event Loop-un alınması
Event Loop (Event Loop)
, Python-da asyncio modulundan istifadə edərək asinxron proqramlaşdırmanın əsas komponentidir. Bu funksiya asinxron tapşırıqların yerinə yetirilməsini, hadisələrin emalını və input-output əməliyyatlarını idarə edir. Event Loop müxtəlif tapşırıqların eyni anda yerinə yetirilməsinə imkan verir, əsas icra axınını bloklamadan.
Event Loop-un yaradılması və alınması
-
asyncio.get_event_loop()
: Mövcud olan Event Loop-u qaytarır və ya mövcud deyilsə yenisini yaradır. -
asyncio.new_event_loop()
: Yeni Event Loop yaradır. -
asyncio.set_event_loop(loop)
: Göstərilən Event Loop-u mövcud kimi qurur.
Nümunə:
asyncio modulunda mövcud olan cari Event Loop var, hansı ki bütün icra olunan tapşırıqları ehtiva edir. Cari Event Loop-u əldə edə və ya yenisini yarada və onu cari kimi qura bilərsiniz. Aşağıdakı nümunədə bu göstərilir.
import asyncio
loop = asyncio.get_event_loop()
print(loop) # Cari Event Loop
new_loop = asyncio.new_event_loop()
asyncio.set_event_loop(new_loop)
print(asyncio.get_event_loop()) # Yeni təyin olunmuş Event Loop
Qeyd etmək lazımdır ki, get_event_loop()
metodu mövcud aktiv Event Loop-u qaytarır. Yeni Event Loop yaratmaq və onu təyin etmək, asinxron proqramlarda konfliktlərdən qaçınmaq üçün diqqətlə istifadə olunmalıdır.
Event Loop-un başladılması
-
run_forever()
: Event Loop-u başladır vəstop()
metodu çağırılana qədər davam edir. -
run_until_complete(future)
: Event Loop-u başladır və verilmiş korutinin və ya gələcək obyektin yerinə yetirilməsindən sonra tamamlanır.
Nümunə:
Event Loop iki rejimdə işə salına bilər: sonsuz işləmə — while True
kimi bir şey, və ya konkret bir tapşırıq yerinə yetirilməyənə qədər.
import asyncio
async def hello():
print("Hello")
await asyncio.sleep(1)
print("World")
loop = asyncio.get_event_loop()
loop.run_until_complete(hello())
loop.close()
Əgər Event Loop
-u run_forever()
rejimində işə salmısınızsa, bu sonsuz dövrdə işləyəcək. run_forever()
metodunun işi yalnız bizim EventLoop
-da hansısa asinxron tapşırıq metod stop()
-u çağıranda dayanacaq.
Event Loop-un dayandırılması
stop()
: Event Loop-u dayandırır.-
is_running()
:True
qaytarır, əgər Event Loop işləyirsə.
Nümunə:
Əgər loop sonsuz rejimdə işləyirsə, davamlı olaraq tapşırıqları qəbul edib yerinə yetirir, özü dayanmır. Kimsə cari loop obyektini alıb onun üzərində stop()
metodunu çağırmalıdır. Sonsuz dövrün işləyib-işləmədiyini bilmək üçün is_running()
metodunu çağırmaq lazımdır.
import asyncio
loop = asyncio.get_event_loop()
loop.stop()
print(loop.is_running()) # False
6.2 Event Loop-un vacib metodları
Metod call_soon(callback, *args)
callback
funksiyasını *args
arqumentləri ilə mümkün qədər tez çağırır.
import asyncio
def my_callback():
print("Callback icra olundu")
loop = asyncio.get_event_loop()
loop.call_soon(my_callback)
loop.run_forever()
callback
funksiyasını tapşırıqlar siyahısının lap əvvəlinə yerləşdirir ki, o mümkün qədər tez icra olunsun. Bu metoda sinxron olmayan funksiyaları ötürmək mümkündür. Bu metod minimal gecikmə ilə tapşırıq icra etmək lazım olduqda faydalıdır, xüsusilə də asinxron tətbiqdə dərhal cavab vermək tələb olunduqda.
Metod call_later(delay, callback, *args)
callback
funksiyasını *args
arqumentləri ilə delay
saniyə sonra çağırır.
import asyncio
def my_callback():
print("Callback gecikmədən sonra icra olundu")
loop = asyncio.get_event_loop()
loop.call_later(2, my_callback)
loop.run_forever()
Bu metod funksiyanın gecikmiş şəkildə çağırılmasına imkan verir: ilk parametr gecikmənin saniyə ilə müddəti (kəsrli ola bilər), daha sonra isə funksiyaya keçid və onun arqumentləri ötürülür. Bu metoda sinxron olmayan funksiyaları ötürmək mümkündür. Bu metod müxtəlif təcil dərəcəsinə malik tapşırıqların icrasını tənzimləmək üçün istifadə edilə bilər və bu, mürəkkəb asinxron sistemlərin layihələndirilməsi zamanı faydalıdır.
Metod call_at(when, callback, *args)
callback
funksiyasını *args
arqumentləri ilə when
vaxtında çağırır.
import asyncio
import time
def my_callback():
print("Callback konkret vaxtda icra olundu")
loop = asyncio.get_event_loop()
when = loop.time() + 2 # Event Loop-da cari zamandan 2 saniyə sonra
loop.call_at(when, my_callback)
loop.run_forever()
Əgər bir tapşırığı 5 saniyə sonra deyil, məsələn, 15:00 və ya 24:00-da başladırmaq istəyirsinizsə, onda daha rahat olar ki, call_at()
funksiyasından istifadə edin, hansı ki, call_soon()
funksiyası kimi işləyir, lakin ilk parametri olaraq fasilənin müddəti yox, müəyyən edilmiş saat verilir. Bu metoda sinxron olmayan funksiyaları ötürmək mümkündür.
Üstünlükləri və xüsusiyyətləri
Asinxron icra: Event Loop bir çox tapşırığın paralel şəkildə icrasına imkan verir və əsas icra axınını blok etmir.
Resursların effektiv idarə edilməsi: Asinxron giriş-çıxış əməliyyatları bloklanmadan yerinə yetirilir ki, bu da proqramları daha effektiv edir.
Elastiklik və genişlənmə qabiliyyəti: Event Loop tapşırıqların planlaşdırılması və hadisələrin idarə edilməsi üçün müxtəlif metodları dəstəkləyir ki, bu da mürəkkəb və genişlənə bilən asinxron tətbiqlərin yaradılmasına imkan verir.
6.3 Tapşırıqlar və gələcək obyektlərlə qarşılıqlı əlaqə
Event Loop tapşırıqların (Tasks) və gələcək obyektlərin (Futures) icrasını idarə edir. O, onların vəziyyətini izləyir və hazır olduqda icrasını təmin edir.
Nümunə:
import asyncio
async def main():
await asyncio.sleep(1)
print("Tapşırıq tamamlandı")
loop = asyncio.get_event_loop()
task = loop.create_task(main())
loop.run_until_complete(task)
Bu nümunədə göstərilir ki, Event Loop create_task
metodu vasitəsilə yaradılmış tapşırığın icrasını necə idarə edir. call_soon()
, call_later()
və call_at()
metodlarından tapşırıqların müxtəlif təcillərlə idarə edilməsi üçün istifadə etmək mümkündür, bu da mürəkkəb asinxron sistemlərin layihələndirilməsində faydalıdır.
GO TO FULL VERSION