Tillbaka till framtiden med async och await i Python 3.5
Av Idego Group

Den här artikeln utforskar Pythons 3.5 nya asynkrona programmeringsfunktioner. Syntaxen async och await förenklar skrivandet av kooperativ, icke-blockerande kod jämfört med tidigare generatorbaserade tillvägagångssätt med @asyncio.coroutine-dekoratorer och yield from-uttryck.
Det traditionella tillvägagångssättet använde @asyncio.coroutine-dekoratorer med yield from-uttryck. Även om det är funktionellt visade sig denna syntax vara mindre intuitiv för utvecklare som inte är bekanta med generatormönster. Den nya syntaxen ersätter dessa konstruktioner med mer läsbara async def-funktionsdefinitioner och await-uttryck.
Båda tillvägagångssätten uppnår samma mål – att hantera flera I/O-operationer effektivt inom en enda tråd via en händelseloop – men med förbättrad tydlighet. Att hämta tre URL:er samtidigt tar ungefär tre sekunder snarare än de sex-plus sekunder som sekventiell körning skulle kräva.
De två syntaktiska stilarna kan dock inte blandas direkt. Funktioner definierade med async def kan inte använda yield from, och generatorbaserade coroutiner kan inte använda await. Utvecklare måste konsekvent välja ett tillvägagångssätt.
Utöver grundläggande syntax introducerar Python 3.5 asynkrona iterationsprotokoll genom async for-loopar och asynkrona kontexthanterare via async with-satser. Dessa funktioner avgränsar explicit var körningen kan pausas, vilket gör kontrollflödet transparent.
Även om syntaktiskt socker ensamt kan verka litet representerar dessa förändringar en betydande infrastruktur som stöder asynkron programmering i Pythons framtid och potentiellt påskyndar adoption av Python 3 framför äldre versioner.