Programovanie

Ako používať asyncio v Pythone

Funkcia asynchrónneho programovania v Pythone, alebo skrátene asynchronizácia, vám umožňuje písať programy, ktoré zvládnu viac práce tým, že nečakajú na dokončenie nezávislých úloh. The asyncio Knižnica zahrnutá v Pythone vám poskytuje nástroje na použitie async na spracovanie disku alebo sieťových I / O bez čakania na všetko ostatné.

asyncio poskytuje dva druhy rozhraní API na prácu s asynchrónnymi operáciami:vysoký stupeň anízky level. Rozhrania API na vysokej úrovni sú najbežnejšie použiteľné a dajú sa použiť v najrôznejších aplikáciách. Nízkoúrovňové API sú výkonné, ale aj zložité a používajú sa menej často.

V tomto článku sa zameriame na API vysokej úrovne. V nasledujúcich častiach si prejdeme najbežnejšie používané rozhrania API na vysokej úrovniasyncio, a ukážte, ako sa dajú použiť na bežné operácie zahŕňajúce asynchrónne úlohy.

Ak ste s asynchronizáciou v Pythone úplne nová alebo si môžete prečítať, ako to funguje, pred ponorením sem si prečítajte môj úvod do asynchrónneho jazyka Python.

Spustite program a úlohy v Pythone

Prirodzene, najbežnejšie použitie pre asyncio je spustenie asynchrónnych častí vášho skriptu Python. To znamená naučiť sa pracovať s postupmi a úlohami.

Asynchrónové komponenty Pythonu, vrátane korutín a úloh, je možné použiť iba s inými asynchrónnymi komponentmi, a nie s konvenčným synchrónnym Pythonom, takže potrebujeteasyncio na preklenutie medzery. K tomu použijeteasyncio.beh funkcia:

importovať asyncio

async def main ():

tlač („Čaká sa 5 sekúnd.“)

pre _ v rozsahu (5):

čakať asyncio.sleep (1)

print (".")

tlač („Ukončené čakanie.“)

asyncio.run (main ())

Toto bežíhlavný()spolu s akýmikoľvek korutínmihlavný() vystrelí a čaká na návrat výsledku.

Program Python by mal mať spravidla iba jeden.run () rovnako ako program Python by mal mať iba jedenhlavný() funkcia. Asynchronizácia, ak sa používa neopatrne, môže sťažiť čítanie kontrolného toku programu. Jediný vstupný bod do asynchrónneho kódu programu zabráni ochlpeniu.

Asynchronné funkcie je možné naplánovať aj akoúlohy, alebo objekty, ktoré zabaľujú korutíny a pomáhajú ich spúšťať.

async def my_task ():

urob niečo()

task = asyncio.create_task (my_task ())

my_task () je potom spustený v slučke udalostí s výsledkami uloženými vúloha.

Ak máte iba jednu úlohu, z ktorej chcete získať výsledky, môžete použiťasyncio.wait_for (úloha) počkajte, kým sa úloha dokončí, a potom použitetask.result () na získanie jeho výsledku. Ak ste však naplánovali niekoľko úloh, ktoré chcete vykonať, a chcete si počkaťvšetko z nich dokončiť, použiťasyncio.wait ([task1, task2]) zhromaždiť výsledky. (Upozorňujeme, že môžete nastaviť časový limit pre operácie, ak nechcete, aby bežali dlhšie ako určitý čas.)

Spravujte slučku asynchronných udalostí v Pythone

Ďalšie bežné použitie preasyncio je spravovať asynchronizáciuslučka udalostí. Smyčka udalostí je objekt, ktorý spúšťa asynchronné funkcie a spätné volania; vytvára sa automaticky pri použitíasyncio.run (). Spravidla chcete použiť iba jednu slučku asynchronných udalostí na jeden program, aby ste mali veci opäť zvládnuté.

Ak píšete pokročilejší softvér, napríklad server, budete potrebovať prístup k slučke udalostí na nižšej úrovni. Za týmto účelom môžete „zdvihnúť kapotu“ a pracovať priamo s vnútornými časťami smyčky udalosti. Ale pre jednoduché práce nebudete potrebovať.

Čítajte a zapisujte údaje pomocou streamov v Pythone

Najlepšie scenáre pre asynchronizáciu sú dlhodobé sieťové operácie, kedy môže aplikácia blokovať čakanie na návrat nejakého iného prostriedku. Za týmto účelomasyncio ponúka toky, ktoré sú mechanizmami vysokej úrovne na vykonávanie sieťových I / O. To zahŕňa fungovanie ako server pre sieťové požiadavky.

asyncio používa dve triedy,StreamReader aStreamWriter, aby ste mohli čítať a písať zo siete na vysokej úrovni. Ak chcete čítať zo siete, použili by steasyncio.open_connection () na otvorenie spojenia. Táto funkcia vráti n-ticuStreamReader aStreamWriter predmety a použili by ste.čítať() a.write () metódy na komunikáciu.

Ak chcete prijímať pripojenia od vzdialených hostiteľov, použiteasyncio.start_server (). The asyncio.start_server () funkcia berie ako argument funkciu spätného volania,client_connected_cb, ktorý sa volá vždy, keď dostane žiadosť. Táto funkcia spätného volania má inštancieStreamReader a StreamWriter ako argumenty, aby ste mohli spracovať logiku čítania a zápisu pre server. (Tu nájdete príklad jednoduchého servera HTTP, ktorý používa serverasyncio- riadenýaiohttp knižnica.)

Synchronizujte úlohy v Pythone

Asynchrónne úlohy majú tendenciu bežať izolovane, ale niekedy budete chcieť, aby navzájom komunikovali.asyncio poskytuje rady a niekoľko ďalších mechanizmov na synchronizáciu medzi úlohami:

  • Frontyasyncio fronty umožňujú asynchrónnym funkciám zoradiť objekty Pythonu tak, aby ich spotrebovali iné asynchrónne funkcie - napríklad na rozdelenie pracovných záťaží medzi rôzne druhy funkcií na základe ich správania.
  • Synchronizačné primitívy: Zámky, udalosti, podmienky a semafory v systéme Windows asyncio fungujú ako ich konvenční kolegovia z Pythonu.

Jedna vec, ktorú treba mať na pamäti pri všetkých týchto metódach, je, že súnie bezpečné pre vlákna. To nie je problém pre asynchronné úlohy bežiace v tej istej slučke udalostí. Ak sa však pokúšate zdieľať informácie s úlohami v inej slučke udalostí, vlákne OS alebo procese, budete musieť použiťzávitovanie modul a jeho objekty.

Ďalej, ak chcetespustenie coutiny cez hranice vlákien, použiteasyncio.run_coroutine_threadsafe () funkcie a odovzdajte slučku udalostí, ktorú chcete použiť ako parameter.

Pozastavte program v Pythone

Ďalšie bežné použitieasyncio, a nedostatočne diskutovaný, čaká na ľubovoľné dlhé obdobie vo vnútri rutiny. Nemôžete použiťtime.sleep () za to, alebo zablokujete celý program. Namiesto toho použiteasyncio.sleep (), čo umožňuje pokračovať v chode ďalších korutín.

V Pythone používajte asynchronizáciu nižšej úrovne

Nakoniec, ak si myslíte, že aplikácia, ktorú vytvárate, môže vyžadovať asyncioKomponenty nižšej úrovne sa rozhliadnite skôr, ako začnete programovať: Existuje veľká šanca, že niekto už vytvoril asynchrónnu knižnicu Pythonu, ktorá robí to, čo potrebujete.

Napríklad, ak potrebujete asynchrónne dotazy DNS, skontrolujteaiodns knižnica a pre asynchrónne relácie SSH existujeasyncSSH. Vyhľadajte PyPI podľa kľúčového slova „asynchrónny“ (plus ďalšie kľúčové slová súvisiace s úlohami) alebo vyhľadajte nápady v ručne upravenom zozname Awesome Asyncio.

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