9.1 Kontekst menecerləri
Yadınızdadırmı, necə with
operatorundan istifadə edərək resurslara giriş idarə olunurdu? Onun köməyi ilə resursun dəqiq nə zaman istifadə edildiyini və nə zaman bu prosesin sonlandığını izləmək olurdu. Eyni şeyi «asinxron resurslar» üçün də etmək mümkündür.
Asinxron kontekst menecerləri (AsyncContextManager)
asinxron proqramlaşdırmada resursları idarə etmək üçün istifadə olunur. Bu, asinxron funksiyalarda resursların düzgün açılıb bağlanmasını təmin edir. Onlar adi kontekst menecerləri ilə oxşar cür çalışır, amma async with
açar sözləri ilə asinxron funksiyalarda istifadə edilməyə uyğunlaşdırılıb.
Mən bu mövzudan geniş danışmayacam, çünki yaxın müddətdə siz öz asinxron kontekst menecerlərinizi yaratmayacaqsız və nə vaxt ki, bu barədə qərar verərsiniz, yəqin ki, hər şeyi unutmuş olacaqsız. Amma mən sizi konsepsiya ilə tanış etmək istəyirəm.
Asinxron kontekst menecerinin yaradılması
Asinxron kontekst menecerləri, __aenter__
və __aexit__
metodlarının köməyi ilə müəyyən edilir. Bu metodlar adi kontekst menecerlərdəki __enter__
və __exit__
metodlarına bənzəyir, amma asinxron şəkildə icra olunurlar.
-
__aenter__()
: Kontekstə daxil olarkən çağırılan asinxron metod. -
__aexit__(exc_type, exc, tb)
: Kontekstə çıxış zamanı çağırılan asinxron metod. Bu metod üç arqument qəbul edir: istisna tipi, istisnanın özü və(traceback)
izləmə məlumatı.
Asinxron kontekst menecerinin yaradılmasına nümunə
import asyncio
class AsyncContextManager:
async def __aenter__(self):
print("Kontekstə daxil olunur")
return self
async def __aexit__(self, exc_type, exc, tb):
print("Kontekstdən çıxır")
async def main():
async with AsyncContextManager():
print("Kontekstin içindəyəm")
asyncio.run(main())
Bu kod necə işləyəcək:
- Funksiyanın
main()
asinxron şəkildə icrası başlayacaq main()
funksiyası yerinə yetirilməyə başlayacaqAsyncContextManager
tipli obyekt yaradılacaq- Obyektdəki
__aenter__()
metodu çağırılacaq print("Kontekstə daxil olunur")
icra ediləcəkprint("Kontekstin içindəyəm")
icra olunacaq- Obyektdəki
__aexit__()
metodu çağırılacaq main()
funksiyasının yerinə yetirilməsi tamamlanacaq
9.2 İstifadə nümunələri
Yuxarıdakı nümunədə məhz asinxron versiya istifadə etmək vacib deyil kontekst menecerinin — kod sinxron olsa belə işləyəcək.
Amma asinxron menecer lazımdır, əgər blok daxilində with
asinxron funksiya çağırılırsa və ya operator await
istifadə olunursa.
Fayllarla iş üçün asinxron kontekst meneceri
Bu nümunədə faylların asinxron oxunması və yazılması üçün aiofiles
kitabxanası istifadə olunur. Asinxron kontekst meneceri aiofiles.open
faylları təhlükəsiz şəkildə açmağa və bağlamağa imkan verir asinxron konteksdə.
import aiofiles
import asyncio
async def main():
async with aiofiles.open('example.txt', mode='w') as file:
await file.write('Salam, dünya!')
asyncio.run(main())
Şəbəkə əməliyyatları üçün asinxron kontekst meneceri
Bu nümunədə asinxron HTTP-sorğuların yerinə yetirilməsi üçün aiohttp
kitabxanası istifadə olunur. Asinxron kontekst menecerləri ClientSession
və session.get
əlaqələrin düzgün idarə olunmasını təmin edir.
import aiohttp
import asyncio
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
async def main():
html = await fetch('https://example.com')
print(html)
asyncio.run(main())
Asinxron kontekst menecerləri fayllar, şəbəkə əlaqələri və digər resurslar kimi resursların avtomatik idarə olunmasını təmin edir ki, onları açıb-bağlamaq lazımdır.
__aenter__
və __aexit__
metodları konteksə daxil olarkən və çıxarkən asinxron əməliyyatların yerinə yetirilməsinə imkan verir və tapşırıqların paralel icrasını təmin edir. Asinxron kontekst menecerlərinin istifadəsi resurs axmalarından qaçmağa və bütün resursların düzgün azad olunacağını təmin etməyə kömək edir.
GO TO FULL VERSION