Funkce asynchronního programování v Pythonu, nebo zkráceně asynchronní, vám umožňuje psát programy, které zvládnou více práce tím, že nebudete čekat na dokončení nezávislých úkolů. The asyncio
Knihovna, která je součástí Pythonu, vám poskytuje nástroje pro použití async pro zpracování disků nebo síťových I / O bez čekání na vše ostatní.
asyncio
poskytuje dva druhy API pro práci s asynchronními operacemi:vysoká úroveň anízká úroveň. Rozhraní API na vysoké úrovni jsou obecně užitečná a jsou použitelná v nejrůznějších aplikacích. Nízkoúrovňová API jsou výkonná, ale také složitá a používají se méně často.
V tomto článku se zaměříme na rozhraní API na vysoké úrovni. V následujících částech projdeme nejčastěji používanými rozhraními API na vysoké úrovniasyncio
, a ukázat, jak je lze použít pro běžné operace zahrnující asynchronní úkoly.
Pokud jste s asynchronizací v Pythonu úplně noví, nebo byste mohli použít osvěžovač toho, jak to funguje, přečtěte si můj úvod do asynchronního Pythonu, než se sem ponoříte.
Spouštějte coutiny a úkoly v Pythonu
Samozřejmě, nejběžnější použití pro asyncio
je spustit asynchronní části vašeho skriptu Pythonu. To znamená naučit se pracovat s rutinami a úkoly.
Asynchronní komponenty Pythonu, včetně korutin a úkolů, lze použít pouze s jinými asynchronními komponentami, nikoli s konvenčním synchronním Pythonem, takže potřebujeteasyncio
k překlenutí mezery. K tomu použijeteasyncio.run
funkce:
importovat asyncioasync def main ():
tisk („Čekání 5 sekund.“)
pro _ v rozsahu (5):
čekat asyncio.sleep (1)
tisk (".")
tisk („Dokončeno čekání.“)
asyncio.run (main ())
To běžíhlavní()
, spolu s jakýmikoli rutinamihlavní()
vystřelí a čeká na návrat výsledku.
Obecně platí, že program v Pythonu by měl mít pouze jeden.běh()
příkaz, stejně jako by měl mít program Python pouze jedenhlavní()
funkce. Async, pokud je používán neopatrně, může ztížit řízení toku programu. Jediný vstupní bod do asynchronního kódu programu brání tomu, aby se věci staly chlupatými.
Asynchronní funkce lze také naplánovat jakoúkolynebo objekty, které obalují korutiny a pomáhají je spouštět.
async def my_task ():dělej něco()
task = asyncio.create_task (my_task ())
můj úkol()
je poté spuštěn ve smyčce událostí s výsledky uloženými vúkol
.
Pokud máte pouze jeden úkol, ze kterého chcete získat výsledky, můžete použítasyncio.wait_for (úkol)
počkejte na dokončení úkolu a poté použijtetask.result ()
získat jeho výsledek. Pokud jste ale naplánovali několik úkolů k provedení a chcete na ně počkatVšechno z nich dokončit, použítasyncio.wait ([task1, task2])
shromáždit výsledky. (Upozorňujeme, že můžete nastavit časový limit pro operace, pokud nechcete, aby běhaly po určitou dobu.)
Spravujte smyčku asynchronních událostí v Pythonu
Další běžné použití proasyncio
je spravovat asyncsmyčka události. Smyčka události je objekt, který spouští asynchronní funkce a zpětná volání; vytváří se automaticky při použitíasyncio.run ()
. Obecně chcete použít pouze jednu smyčku asynchronních událostí na program, znovu, abyste měli věci zvládnutelné.
Pokud píšete pokročilejší software, například server, budete potřebovat přístup k smyčce událostí na nižší úrovni. Za tímto účelem můžete „zvednout kapotu“ a pracovat přímo s vnitřními prvky smyčky události. Ale pro jednoduché úlohy nebudete muset.
Čtení a zápis dat pomocí streamů v Pythonu
Nejlepší scénáře pro asynchronní provoz jsou dlouhotrvající síťové operace, kde aplikace může blokovat čekání, než nějaký jiný prostředek vrátí výsledek. Do toho konce,asyncio
nabízí proudy, což jsou mechanismy na vysoké úrovni pro provádění síťových I / O. To zahrnuje jednání jako server pro síťové požadavky.
asyncio
používá dvě třídy,StreamReader
aStreamWriter
, číst a psát ze sítě na vysoké úrovni. Pokud chcete číst ze sítě, použili bysteasyncio.open_connection ()
otevřete připojení. Tato funkce vrací n-ticiStreamReader
aStreamWriter
předměty, a ty bys použil.číst()
a.napsat()
metody na každém komunikovat.
Chcete-li přijímat připojení od vzdálených hostitelů, použijteasyncio.start_server ()
. The asyncio.start_server ()
funkce bere jako argument funkci zpětného volání,client_connected_cb
, který je volán vždy, když obdrží požadavek. Tato funkce zpětného volání přebírá instanceStreamReader
a StreamWriter
jako argumenty, takže můžete zpracovat logiku čtení / zápisu pro server. (Zde naleznete příklad jednoduchého serveru HTTP, který používáasyncio
-drivenaiohttp
knihovna.)
Synchronizujte úkoly v Pythonu
Asynchronní úkoly mají tendenci běžet izolovaně, ale někdy budete chtít, aby spolu komunikovali.asyncio
poskytuje fronty a několik dalších mechanismů pro synchronizaci mezi úkoly:
- Fronty:
asyncio
fronty umožňují asynchronním funkcím uspořádat objekty Pythonu tak, aby je spotřebovaly jiné asynchronní funkce - například k distribuci úloh mezi různé druhy funkcí na základě jejich chování. - Synchronizační primitiva: Zámky, události, podmínky a semafory v
asyncio
fungují jako jejich konvenční kolegové z Pythonu.
Jedna věc, kterou je třeba mít na paměti u všech těchto metod, je, že jsoune bezpečné pro vlákna. U asynchronních úkolů běžících ve stejné smyčce událostí to není problém. Pokud se však pokoušíte sdílet informace s úkoly v jiné smyčce událostí, vlákně OS nebo procesu, budete muset použítzávitování
modul a jeho objekty.
Dále, pokud chcetezahájení coroutiny přes hranice podprocesu, použijteasyncio.run_coroutine_threadsafe ()
funkce a předejte smyčku události, která se s ní použije jako parametr.
Pozastavte program v Pythonu
Další běžné použitíasyncio
, a nedostatečně diskutovaný, čeká na libovolnou dobu uvnitř korutiny. Nemůžete použíttime.sleep ()
nebo zablokujete celý program. Místo toho použijteasyncio.sleep ()
, což umožňuje dalším chodům pokračovat.
Použijte async na nižší úrovni v Pythonu
Nakonec, pokud si myslíte, že aplikace, kterou vytváříte, může vyžadovat asyncio
Komponenty na nižší úrovni se před zahájením programování porozhlédněte: Existuje velká šance, že někdo již vytvořil asynchronní knihovnu Pythonu, která dělá to, co potřebujete.
Například pokud potřebujete asynchronní dotazování DNS, zkontrolujteaiodns
knihovna a pro asynchronní relace SSH je tuasyncSSH
. Hledejte PyPI podle klíčového slova „asynchronní“ (plus další klíčová slova související s úkoly) nebo zkontrolujte ručně vytvořený seznam Awesome Asyncio.