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.
10 saniyə gözləyəcək asinxron bir task yaradacağıqOnuTaskobyektinin içinə qoyacağıqTask-ın işləməyə başlaması üçün bir saniyə gözləyəcəyikTask-ı ləğv edəcəyik –task.cancel()-
Əgər daha sonra task-ın tamamlanmasınıawaitoperatoru ilə gözləməyə çalışsaq,CancelledErroristisnası 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.
GO TO FULL VERSION