Python Academy · Pelajaran

Pengurus Konteks dan Lelaran Tak Segerak

Laksanakan protokol async with dan async for.

Pelajaran 3 daripada 413 langkah

Pengurus Konteks dan Lelaran Tak Segerak ialah pelajaran Python Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Python Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Python Academy merangkumi sejumlah 4 pelajaran.

Pernyataan async with

Gunakan async with untuk pengurus konteks yang persediaan atau peleraian sumbernya melibatkan penantian I/O. Objek yang diurus mesti melaksanakan __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__

Kedua-duanya ialah coroutine. __aenter__ dinantikan semasa masuk; __aexit__ dinantikan semasa keluar walaupun pengecualian berlaku.

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 membolehkan anda menulis pengurus konteks tak segerak sebagai fungsi penjana tak segerak.

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 mengulang melalui boleh lelar tak segerak, iaitu objek yang melaksanakan __aiter__ dan __anext__. Setiap lelaran mungkin 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())

Penjana tak segerak

Fungsi async def yang mengandungi yield ialah penjana tak segerak. Gunakan async for untuk menggunakannya.

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 fail tak segerak

Pustaka aiofiles membalut operasi fail dalam pengurus konteks dan lelar tak segerak.

# 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 ClientSession aiohttp

aiohttp.ClientSession ialah pengurus konteks tak segerak untuk membuat permintaan HTTP serentak.

# 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"))

Berbilang pengurus konteks tak segerak

Susun berbilang klausa async with pada satu baris menggunakan bentuk berkurungan 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 mengurus set pengurus konteks tak segerak yang dinamik.

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 kod tak segerak dengan pytest-asyncio

pytest-asyncio membolehkan anda menulis fungsi ujian tak segerak 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 lelar tak segerak

Sesuatu objek ialah boleh lelar tak segerak jika mempunyai __aiter__. Objek itu ialah lelar tak segerak jika turut mempunyai __anext__. Penjana tak segerak melaksanakan kedua-duanya secara automatik.

import asyncio

async def gen():
    yield 1
    yield 2

async def main():
    g = gen()
    print(await g.__anext__())   # 1
    print(await g.__anext__())   # 2

Semakan pantas

Apakah kaedah garis bawah berganda yang mesti dilaksanakan oleh objek untuk digunakan dengan async with?

Imbas kembali

Gunakan async with untuk sumber yang memerlukan persediaan atau peleraian tak segerak. Gunakan async for untuk boleh lelar yang menghasilkan nilai secara tak segerak. Penjana tak segerak memudahkan penciptaan lelar tak segerak. Pustaka seperti aiofiles dan aiohttp menyediakan operasi fail dan HTTP yang natif tak segerak.

Percuma untuk bermula

Pelajari Python dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
76
Pelajaran
320

Soalan Lazim

Adakah pelajaran “Pengurus Konteks dan Lelaran Tak Segerak” percuma?

Ya — teks penuh “Pengurus Konteks dan Lelaran Tak Segerak” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Python Academy, tingkat taraf kepada CoddyKit PRO. Kursus Python Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Pengurus Konteks dan Lelaran Tak Segerak”?

Laksanakan protokol async with dan async for. Anda berlatih Python Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Python Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Python Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Pengurus Konteks dan Lelaran Tak Segerak” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Python Academy ini?

Ya. Setiap pelajaran Python Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Korutin dan Gelung Peristiwa
  2. await, Tugasan dan Pengumpulan
  3. Pengurus Konteks dan Lelaran Tak Segerak
  4. Corak I/O Tak Segerak dalam Pengeluaran
← Kembali ke Python Academy