Asenkron Bağlam Yöneticileri ve Yineleyiciler
async with ve async for protokollerini uygulayın.
Asenkron Bağlam Yöneticileri ve Yineleyiciler, CoddyKit'te ücretsiz bir Python Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Python Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Python Academy kursu toplamda 4 dersten oluşur.
async with İfadesi
Kurulumunda veya kapatılmasında G/Ç beklemesi gereken bağlam yöneticileri için async with kullanın. Yönetilen nesne, __aenter__ ve __aexit__ yöntemlerini uygulamalıdır.
import asyncio
class AsyncFile:
async def __aenter__(self):
print("open")
return self
async def __aexit__(self, *args):
print("close")
async def main():
async with AsyncFile() as f:
print("using")
asyncio.run(main())__aenter__ ve __aexit__
Her ikisi de korutindir. Girişte __aenter__, çıkışta ise __aexit__ beklenir; bu, bir özel durum oluşmuş olsa bile geçerlidir.
import asyncio
class DBSession:
async def __aenter__(self):
self.conn = await async_connect()
return self.conn
async def __aexit__(self, exc_type, exc_val, exc_tb):
if exc_type:
await self.conn.rollback()
else:
await self.conn.commit()
await self.conn.close()
return False@asynccontextmanager
contextlib.asynccontextmanager, eşzamansız bağlam yöneticilerini eşzamansız üreteç işlevleri olarak yazmanızı sağlar.
from contextlib import asynccontextmanager
import asyncio
@asynccontextmanager
async def managed_resource():
print("acquire")
try:
yield {"status": "ready"}
finally:
print("release")
async def main():
async with managed_resource() as r:
print(r["status"])
asyncio.run(main())async for İfadesi
async for, __aiter__ ve __anext__ yöntemlerini uygulayan eşzamansız yinelenebilir bir nesne üzerinde yineleme yapar. Her yineleme G/Ç işlemi içerebilir.
import asyncio
class AsyncCounter:
def __init__(self, n): self.n, self.i = n, 0
def __aiter__(self): return self
async def __anext__(self):
if self.i >= self.n: raise StopAsyncIteration
await asyncio.sleep(0)
self.i += 1
return self.i
async def main():
async for val in AsyncCounter(3):
print(val)
asyncio.run(main())Eşzamansız Üreteçler
yield içeren bir async def işlevi, eşzamansız bir üreteçtir. Bu üreteçten değer almak için async for kullanın.
import asyncio
async def ticker(n):
for i in range(n):
await asyncio.sleep(1)
yield i
async def main():
async for val in ticker(3):
print(val) # 0, 1, 2 with 1-s pauses
asyncio.run(main())Eşzamansız Dosya G/Ç için aiofiles
aiofiles kitaplığı, dosya işlemlerini eşzamansız bağlam yöneticileri ve eşzamansız yineleyiciler içinde sarar.
# pip install aiofiles
import aiofiles, asyncio
async def main():
async with aiofiles.open("data.txt", "r") as f:
async for line in f:
print(line.strip())aiohttp İstemci Oturumu
aiohttp.ClientSession, eşzamanlı HTTP istekleri yapmak için kullanılan bir eşzamansız bağlam yöneticisidir.
# pip install aiohttp
import aiohttp, asyncio
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
return await resp.json()
asyncio.run(fetch("https://api.example.com/data"))Birden Çok Eşzamansız Bağlam Yöneticisi
Birden çok async with yan tümcesini tek satırda sıralayabilirsiniz (Python 3.10 ve sonraki sürümlerde parantezli biçim).
import asyncio
async def main():
async with (
open_db() as db,
open_cache() as cache,
):
data = await db.fetch("SELECT 1")
await cache.set("key", data)AsyncExitStack
contextlib.AsyncExitStack, dinamik bir eşzamansız bağlam yöneticileri kümesini yönetir.
from contextlib import AsyncExitStack
import asyncio
async def main():
async with AsyncExitStack() as stack:
conn1 = await stack.enter_async_context(connect("db1"))
conn2 = await stack.enter_async_context(connect("db2"))
await process(conn1, conn2)Eşzamansız Kodu pytest-asyncio ile Sınama
pytest-asyncio, @pytest.mark.asyncio işaretleyicisiyle eşzamansız sınama işlevleri yazmanızı sağlar.
# pip install pytest-asyncio
import pytest, asyncio
async def fetch(): return 42
@pytest.mark.asyncio
async def test_fetch():
result = await fetch()
assert result == 42Eşzamansız Yineleyici Protokolü Özeti
Bir nesne, __aiter__ özelliğine sahipse eşzamansız yinelenebilirdir. Ayrıca __anext__ özelliğine de sahipse eşzamansız yineleyicidir. Eşzamansız üreteçler her ikisini de otomatik olarak uygular.
import asyncio
async def gen():
yield 1
yield 2
async def main():
g = gen()
print(await g.__anext__()) # 1
print(await g.__anext__()) # 2Hızlı Kontrol
Bir nesnenin async with ile kullanılabilmesi için hangi özel yöntemleri uygulaması gerekir?
Özet
Eşzamansız kurulum veya kapatma gerektiren kaynaklar için async with kullanın. Değerleri eşzamansız olarak üreten yinelenebilir nesneler için async for kullanın. Eşzamansız üreteçler, eşzamansız yineleyici oluşturmayı kolaylaştırır. aiofiles ve aiohttp gibi kitaplıklar, eşzamansız dosya ve HTTP işlemleri sunar.
Sıkça Sorulan Sorular
“Asenkron Bağlam Yöneticileri ve Yineleyiciler” dersi ücretsiz mi?
Evet — “Asenkron Bağlam Yöneticileri ve Yineleyiciler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Python Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Python Academy kursu toplamda 4 dersten oluşur.
“Asenkron Bağlam Yöneticileri ve Yineleyiciler” dersinde ne öğreneceğim?
async with ve async for protokollerini uygulayın. Python Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Python Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Python Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Asenkron Bağlam Yöneticileri ve Yineleyiciler” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Python Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Python Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Korütinler ve Olay Döngüsü
- await, Görevler ve Toplama
- Asenkron Bağlam Yöneticileri ve Yineleyiciler
- Üretim Ortamlarında Asenkron G/Ç Kalıpları