Event Loop

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

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()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.

1
Опрос
Çoxaxınlılıq,  25 уровень,  5 лекция
недоступен
Çoxaxınlılıq
Çoxaxınlılıq
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION