CodeGym /Kurslar /Python SELF AZ /Asinxron kontekst menecerləri

Asinxron kontekst menecerləri

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

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____aexit__ metodlarının köməyi ilə müəyyən edilir. Bu metodlar adi kontekst menecerlərdəki __enter____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:

  1. Funksiyanın main() asinxron şəkildə icrası başlayacaq
  2. main() funksiyası yerinə yetirilməyə başlayacaq
  3. AsyncContextManager tipli obyekt yaradılacaq
  4. Obyektdəki __aenter__() metodu çağırılacaq
  5. print("Kontekstə daxil olunur") icra ediləcək
  6. print("Kontekstin içindəyəm") icra olunacaq
  7. Obyektdəki __aexit__() metodu çağırılacaq
  8. 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 ClientSessionsession.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____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.

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