Pengelola Konteks dan Iterator Asinkron
Implementasikan protokol async with dan async for.
Pengelola Konteks dan Iterator Asinkron adalah pelajaran Python Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Python Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Python Academy mencakup 4 pelajaran total.
Pernyataan async with
Gunakan async with untuk pengelola konteks yang penyiapan dan pembongkarannya melibatkan penantian I/O. Objek yang dikelola harus mengimplementasikan __aenter__ dan __aexit__.
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__ dan __aexit__
Keduanya adalah korutin. __aenter__ ditunggu saat memasuki konteks; __aexit__ ditunggu saat keluar, bahkan jika terjadi pengecualian.
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 memungkinkan Anda menulis pengelola konteks asinkron sebagai fungsi generator asinkron.
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())Pernyataan async for
async for melakukan iterasi atas iterabel asinkron—objek yang mengimplementasikan __aiter__ dan __anext__. Setiap iterasi dapat melibatkan I/O.
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())Generator Asinkron
Fungsi async def yang berisi yield adalah generator asinkron. Gunakan async for untuk mengonsumsinya.
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())aiofiles untuk I/O Berkas Asinkron
Pustaka aiofiles membungkus operasi berkas dalam pengelola konteks dan iterator asinkron.
# 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())Sesi Klien aiohttp
aiohttp.ClientSession adalah pengelola konteks asinkron untuk membuat permintaan HTTP secara bersamaan.
# 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"))Beberapa Pengelola Konteks Asinkron
Susun beberapa klausa async with dalam satu baris menggunakan bentuk yang diberi tanda kurung pada Python 3.10+.
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 mengelola sekumpulan pengelola konteks asinkron yang dinamis.
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)Menguji Kode Asinkron dengan pytest-asyncio
pytest-asyncio memungkinkan Anda menulis fungsi pengujian asinkron dengan penanda @pytest.mark.asyncio.
# pip install pytest-asyncio
import pytest, asyncio
async def fetch(): return 42
@pytest.mark.asyncio
async def test_fetch():
result = await fetch()
assert result == 42Ringkasan Protokol Iterator Asinkron
Sebuah objek merupakan iterabel asinkron jika memiliki __aiter__. Objek tersebut merupakan iterator asinkron jika juga memiliki __anext__. Generator asinkron mengimplementasikan keduanya secara otomatis.
import asyncio
async def gen():
yield 1
yield 2
async def main():
g = gen()
print(await g.__anext__()) # 1
print(await g.__anext__()) # 2Pemeriksaan Singkat
Metode dunder apa yang harus diimplementasikan objek agar dapat digunakan dengan async with?
Ringkasan
Gunakan async with untuk sumber daya yang memerlukan penyiapan dan pembongkaran asinkron. Gunakan async for untuk iterabel yang menghasilkan nilai secara asinkron. Generator asinkron menyederhanakan pembuatan iterator asinkron. Pustaka seperti aiofiles dan aiohttp menyediakan operasi berkas dan HTTP yang mendukung asinkron secara bawaan.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pengelola Konteks dan Iterator Asinkron” gratis?
Ya — teks lengkap “Pengelola Konteks dan Iterator Asinkron” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Python Academy, upgrade ke CoddyKit PRO. Kursus Python Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pengelola Konteks dan Iterator Asinkron”?
Implementasikan protokol async with dan async for. Kamu berlatih Python Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Python Academy?
Tidak diperlukan pengalaman sebelumnya. Python Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Pengelola Konteks dan Iterator Asinkron” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Python Academy ini?
Ya. Setiap pelajaran Python Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Coroutine dan Event Loop
- await, Task, dan Pengumpulan
- Pengelola Konteks dan Iterator Asinkron
- Pola I/O Asinkron dalam Produksi