Programování

Jak používat asyncio v Pythonu

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 asyncio

async 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:

  • Frontyasyncio 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 asyncioKomponenty 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.

$config[zx-auto] not found$config[zx-overlay] not found