Pengurus Konteks dan Lelaran Tak Segerak
Laksanakan protokol async with dan async for.
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 == 42Ringkasan 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__()) # 2Semakan 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.
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
- Korutin dan Gelung Peristiwa
- await, Tugasan dan Pengumpulan
- Pengurus Konteks dan Lelaran Tak Segerak
- Corak I/O Tak Segerak dalam Pengeluaran