0Pricing
Python Academy · Pelajaran

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 == 42

Ringkasan 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__())   # 2

Pemeriksaan 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

  1. Coroutine dan Event Loop
  2. await, Task, dan Pengumpulan
  3. Pengelola Konteks dan Iterator Asinkron
  4. Pola I/O Asinkron dalam Produksi
← Kembali ke Python Academy