Task Sinfi

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

7.1 Tapşırıqların yaradılması

Task sinfi asyncio modulunda korutinlərin icrasını idarə etmək üçün istifadə olunur. (Tasks) adlanan tapşırıqlar korutinlər üçün idarəçilik və müşahidə imkanı yaradan bir növ qablaşdırmadır. Task sinfi event loop-lar vasitəsilə korutinləri paralel şəkildə işə salmağa imkan verir.

Task sinfinin əsas metodları:

Task sinfi korutinlərin idarə olunması üçün əlavə üstünlüklər təqdim edən bir növ qablaşdırmadır:

Korutinlərin icrasının idarə olunması:

Tapşırıqlar korutinlərin icrasını asanlıqla idarə etməyə, onların vəziyyətini nəzarət altında saxlamağa və nəticələrini əldə etməyə imkan verir.

Tapşırıqların ləğvi:

Tapşırıqları ləğv etmək imkanı Task sinfini uzunmüddətli əməliyyatların idarə olunmasında faydalı edir, çünki bu əməliyyatlar tam başa çatmadan dayandırıla bilər.

Callback-lər:

Tapşırıqlar callback-lər əlavə etməyi dəstəkləyir ki, bu da tapşırıqların tamamlanmasından sonra əlavə əməliyyatlar etməyə şərait yaradır.

Tapşırıqların yaradılması:

Tapşırıqlar asyncio.create_task(coroutine) funksiyası vasitəsilə və ya loop.create_task(coroutine) metodu ilə yaradılır ki, bu da korutinin icrasını planlaşdırır.


import asyncio

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

7.2 Əsas metodlar

Task.cancel() metodu:

Task'ı ləğv etməyi tələb edir. Əgər task hələ tamamlanmayıbsa, o CancelledError istisnası ilə tamamlanacaq.

Gəlin bunun necə işlədiyini göstərmək üçün kiçik bir proqram yazaq.

  1. 10 saniyə gözləyəcək asinxron bir task yaradacağıq
  2. Onu Task obyektinin içinə qoyacağıq
  3. Task-ın işləməyə başlaması üçün bir saniyə gözləyəcəyik
  4. Task-ı ləğv edəcəyik – task.cancel()
  5. Əgər daha sonra task-ın tamamlanmasını await operatoru ilə gözləməyə çalışsaq, CancelledError istisnası alacağıq.

import asyncio

async def main():
    task = asyncio.create_task(asyncio.sleep(10)) 
    await asyncio.sleep(1)
    task.cancel()
    try:
        await task
    except asyncio.CancelledError:
        print("Task ləğv olundu")
            
asyncio.run(main())

Task.result() metodu:

Task-ın icrasının nəticəsini qaytarır. Əgər task istisna ilə tamamlanıbsa, bu halda result() çağırıldığında həmin istisna atılır.


import asyncio

async def main():
    task = asyncio.create_task(asyncio.sleep(1, result='Tamamlandı'))
    result = await task
    print(result)  # Output: Tamamlandı
            
asyncio.run(main())

Bizim nümunədə əlavə kod yazmağa ehtiyac olmadı — await operatoru Task obyekti ilə necə işləməyi bilir: task tamamlandıqdan sonra özü avtomatik result() metodunu çağırır və alınan nəticəni qaytarır.

Task.exception() metodu:

Task-ın atdığı istisnanı qaytarır. Əgər task heç bir istisna ilə tamamlanmayıbsa, None qaytarır.


import asyncio

async def main():
    task = asyncio.create_task(asyncio.sleep(1))
    try:
        result = await task
    except Exception as e:
        print(f"Task istisna ilə tamamlandı: {e}")

asyncio.run(main())

Həmçinin əlavə kod yazmağa ehtiyac yoxdur — əgər task-da istisna olarsa, await operatoru tərəfindən exception() metodu çağırılır.

Task.add_done_callback(callback) metodu:

Task tamamlandıqda çağırılacaq (callback) funksiyasını əlavə edir.


import asyncio

def callback(future):
    print("Task tamamlandı")
            
async def main():
    task = asyncio.create_task(asyncio.sleep(1))
    task.add_done_callback(callback)
    await task
            
asyncio.run(main())

Task-a tamamlama anında avtomatik olaraq çağırılacaq bir funksiya əlavə edə bilirik. Bu yanaşma kodu çox elastik edir. Həmçinin, bir task-a bir neçə fərqli funksiya əlavə etmək mümkündür, və bu istənilən task üçün edilə bilər.

Task.done() metodu:

Əgər task tamamlanıbsa (uğurla, səhvlə və ya ləğv edilib), True qaytarır.


import asyncio

async def main():
    task = asyncio.create_task(asyncio.sleep(1))
    await asyncio.sleep(1.5)
    print(task.done())  # Output: True
            
asyncio.run(main())

done() metodundan istifadə edərək task-ın uğurla tamamlanıb- tamamlanmadığını öyrənmək olar. Əslində isə, əgər task ləğv olunmayıbsa başqa cür də tamamlanmış ola bilər. Məsələn, istisna ilə. Amma əgər task konkret olaraq ləğv olunubsa (cancel), metod False qaytaracaq, başqa hallarda isə True qaytaracaq.

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