Python async / await Magyarázat: A 2026-os oktatóanyag
Az Async a Pythonban zavaró hírnévvel bír. Nem kell, hogy az legyen. Miután beépített egy mondatot – az async lehetővé teszi, hogy EGY szál több I/O-hoz kötött feladatot egymásba rendezve futtasson – minden más következik.
Ez az oktatóanyag bemutatja: mit csinál valójában az "async def" és a "wait", amikor az aszinkron nyer, illetve amikor nem a megfelelő eszköz, a négy mintát, amelyet minden aszinkron kódbázis használ (szekvenciális, összegyűjtés, szemafor, időtúllépés), valamint a három mód, ahogy a kezdők csendben lenyelhetik a hibákat.
Az egymondatos mentális modell
Az Async a Pythonban együttműködő párhuzamosság egyetlen szálban. Amikor a kód eléri a "várni" értéket, a vezérlés visszatér az eseményhurokhoz, amely egy másik feladatot futtathat, miközben az első I/O-ra vár. Amikor az I/O befejeződik, a hurok onnan folytatja az első feladatot, ahol szünetelt.
Ennyi. Nincsenek szálak, nincsenek folyamatok, nincs párhuzamosság (a CPython-with-GIL értelmében). Csak egy szál sok olyan feladattal zsonglőrködik, amelyek idejük nagy részét a hálózaton / lemezen / adatbázison töltik.
Az aszinkron gyorsabb, ha a szűk keresztmetszet vár, nem a számítástechnika.
A háromsoros minimálisan életképes aszinkron program
async def hello()— deklarál egy korutint. Ahello()meghívása nem futtatja le a kódot; korutin objektumot hoz létre.wait asyncio.sleep(1)— 1 másodpercre visszaadja a vezérlést az eseményhuroknak.- `asyncio.run(hello()) — eseményhurkot hoz létre, és a korutint a befejezésig lefuttatja.
Szabály: `várni` csak az `async def`-on belül. A várakozás meghívása egy normál függvényben SyntaxError.
Amikor az aszinkron nyer (és amikor nem)
Az Async nyer: I/O-kötött munka
Minden olyan feladat, amely a falióra idejének nagy részét VÁRAKOZÁSSAL tölti, aszinkronizálható:
- HTTP kérések (külső API-k, scraping, webhookok)
- Adatbázis lekérdezések
- Fájl olvas/ír
- WebSocket / gRPC adatfolyamok
- Várólista fogyasztók (Redis, RabbitMQ, Kafka)
Példa: 100 URL lekérése.
50-100-szoros falióra-gyorsítás nehéz I/O-s munkákhoz. Ez az a hely, ahol az aszinkron kiérdemli az összetett költségvetését.
Az async ELVESZTÉSE: CPU-hoz kötött munka
Az Async nem ad párhuzamosságot a számításokhoz. Mivel kooperatív egyszálú, a CPU-hot loop blokkolja a teljes eseményhurkot.
A pbkdf2 futása közben minden más feladat kihal. A CPU-hoz kötött munkához a multiprocessing vagy a concurrent.futures.ProcessPoolExecutor kifejezést használja, ne az async-et.
Vegyes munkaterhelés: run_in_executor
Ha EGY lépés CPU-nehéz, a többi pedig I/O, csomagolja be a CPU lépést úgy, hogy egy szálkészletben fusson a hurok blokkolása nélkül:
A "Nincs" = alapértelmezett szálkészlet. Kiválóan alkalmas harmadik féltől származó szinkronizálási könyvtárak hívására, amelyek lassúak, de nem írhatók át.
A négy minta
1. Szekvenciális – egyszerre egy feladat
Akkor használja, ha minden kérés az előző eredményétől függ.
2. asyncio.gather — egyszerre tüzel
Független I/O feladatok alapértelmezett választása. De: ha 10 000 feladatot gyűjt össze egy API-val, akkor sebességkorlátozott vagy kimerítő fájlleírókat kap. Itt jön be a szemafor minta.
3. Szemafor — sapka párhuzamosság
Az asyncio.Semaphore(N) legfeljebb N feladatot enged át bármikor az async with sem:-en. A többi feladatsor. Használja bármilyen sebességkorlátozással rendelkező külső API-hoz vagy kapcsolatkészlettel rendelkező adatbázishoz.
4. Időtúllépés – hagyja abba a lassú munkát
Az asyncio.wait_for N másodperc után megszakítja a mögöttes feladatot. Nélkülözhetetlen minden olyan aszinkron kódhoz, amely hálózattal kommunikál – soha ne hagyjon korlátlan várakozást.
A három hibanyelő csapda
1. csapda: asyncio.gather a return_exceptions=True paraméterrel
Hasznos, ha meg szeretné tartani a részeredményeket, de halálos, ha nem ellenőriz minden eredményt:
Az ellenőrzés nélkül a hibák csendben eltűnnek.
2. csapda: Tüzeld el és felejtsd el a feladatokat
Ha a background_work() megemelkedik, a Python figyelmeztetést ad ki leállításkor, és továbblép. Ha bármit érdekel, tárolja a feladatot, és "várja meg", vagy használja az "asyncio.TaskGroup" (3.11+) programot, amely minden hibát továbbít.
3. csapda: Szinkronizálja a kódot az aszinkron belül
a kérések szinkron. Még egy "async def"-en belül is a "requests.get" blokkolja a teljes ciklust, amíg a válasz meg nem érkezik. Használja a "httpx" (vagy "aiohttp") protokollt az aszinkron HTTP-hez.
Szabály: soha ne használjon szinkron I/O-könyvtárat az aszinkron kódon belül. Ha a könyvtárnak nincs aszinkron változata, csomagolja be a "run_in_executor" karakterláncba.
asyncio.TaskGroup – a 2026-os kibontakozás módja
A Python 3.11 hozzáadta a "TaskGroup"-ot, amely tisztán javítja a tűz és felejts problémát:
Strukturált párhuzamosság – nincsenek elveszett hibák, nincsenek árva feladatok. Inkább ezt a puszta "create_task" helyett a modern kódban.
Valós példa: sebességkorlátozott kaparó
Mind a négy minta 15 sorban: korlátos egyidejűség (szemafor), időtúllépések (wait_for), explicit hibaelágazások (nincs lenyelés) és összegyűjtés a kifutóhoz. Másolja és illessze be ezt az alakzatot bármely aszinkron I/O feladatba.
A Python Async-nek valódi tanulási görbéje van, de a mentális modell egyszerű: egy szál, a kooperatív szünetek „várakoznak”, az I/O átfedésben van. Master Gather + Semaphore + wait_for + TaskGroup, és az aszinkron munka 95%-át lefedi, amit valaha is fog írni.
Következő lépés: a Senior Python track 20 gyakorlati leckét tartalmaz az asyncioról, a TaskGroupról, az aiohttp/httpx-ről és a fenti párhuzamossági mintákról – valódi Python futtatásával a böngészőben.