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ğıq
Onu
Task
obyektinin içinə qoyacağıqTask-ın işləməyə başlaması üçün bir saniyə gözləyəcəyik
Task-ı ləğv edəcəyik –
task.cancel()
-
Ə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.
GO TO FULL VERSION