Skip to main content
idego
Python

Powrót do przyszłości z async i await w Pythonie 3.5

Autor: Idego Group

Powrót do przyszłości z async i await w Pythonie 3.5

Artykuł ten bada nowe funkcje programowania asynchronicznego w Pythonie 3.5. Składnia async i await upraszcza pisanie kooperatywnego, nieblokującego kodu w porównaniu z wcześniejszymi podejściami opartymi na generatorach z użyciem dekoratorów @asyncio.coroutine i wyrażeń yield from.

Tradycyjne podejście używało dekoratorów @asyncio.coroutine z wyrażeniami yield from. Choć funkcjonalne, ta składnia okazała się mniej intuicyjna dla programistów nieznajomych ze wzorcami generatorów. Nowa składnia zastępuje te konstrukcje bardziej czytelnymi definicjami funkcji async def i wyrażeniami await.

Oba podejścia osiągają ten sam cel – zarządzanie wieloma operacjami wejścia/wyjścia efektywnie w jednym wątku za pomocą pętli zdarzeń – ale z większą przejrzystością. Pobieranie trzech URL-i jednocześnie zajmuje około trzech sekund, zamiast ponad sześciu sekund, jakie wymagałoby sekwencyjne wykonanie.

Jednak dwa style składniowe nie mogą być bezpośrednio mieszane. Funkcje zdefiniowane za pomocą async def nie mogą używać yield from, a koroutiny oparte na generatorach nie mogą używać await. Programiści muszą konsekwentnie wybrać jedno podejście.

Poza podstawową składnią, Python 3.5 wprowadza asynchroniczne protokoły iteracji przez pętle async for i asynchroniczne menedżery kontekstu za pomocą instrukcji async with. Te funkcje wyraźnie delineują miejsca, gdzie wykonanie może zostać zawieszone, czyniąc przepływ sterowania przejrzystym.

Choć sama składniowa cukier może wydawać się drobnostką, te zmiany reprezentują znaczącą infrastrukturę wspierającą programowanie asynchroniczne w przyszłości Pythona, potencjalnie przyspieszając adopcję Pythona 3 w stosunku do starszych wersji.

Powiązane artykuły