Programiranje

Kako uporabljati asyncio v Pythonu

Pythonova asinhrona programska funkcionalnost ali na kratko async omogoča pisanje programov, ki opravijo več dela, tako da ne čakajo, da se samostojna opravila končajo. The asincio Knjižnica, ki je vključena v Python, vam ponuja orodja za uporabo async za obdelavo diskovnih ali omrežnih V / I, ne da bi vse ostalo čakalo.

asincio ponuja dve vrsti API-jev za obravnavo asinhronih operacij:visoka stopnja innizka stopnja. API-ji na visoki ravni so na splošno najbolj uporabni in veljajo za najrazličnejše aplikacije. API-ji na nizki ravni so zmogljivi, a tudi zapleteni in se uporabljajo manj pogosto.

V tem članku se bomo osredotočili na API-je na visoki ravni. V spodnjih razdelkih se bomo sprehodili po najpogosteje uporabljenih API-jih na visoki ravni vasincioin pokažejo, kako jih je mogoče uporabiti za običajne operacije, ki vključujejo asinhrone naloge.

Če ste popolnoma novi pri asinhronizaciji v Pythonu ali pa bi lahko uporabili osvežitev o tem, kako deluje, preberite moj uvod v Python async, preden se tu potopite.

Zaženite podprograme in naloge v Pythonu

Seveda je najpogostejša uporaba za asincio je zagon asinhronih delov skripta Python. To pomeni, da se naučite delati s programi in nalogami.

Pythonove async komponente, vključno s programom in nalogami, je mogoče uporabljati samo z drugimi async komponentami, ne pa tudi z običajnim sinhronim Pythonom, zato potrebujeteasincio za premostitev vrzeli. Če želite to narediti, uporabiteasyncio.run funkcija:

uvoz asyncio

async def main ():

print ("Čakanje 5 sekund.")

za _ v območju (5):

await asyncio.sleep (1)

natisni (".")

print ("Končano čakanje.")

asyncio.run (main ())

To tečeglavni (), skupaj z morebitnimi podprogramiglavni () požari in čaka, da se rezultat vrne.

Praviloma mora imeti program Python samo enega.run () izjavo, tako kot bi moral imeti program Python samo enegaglavni () funkcijo. Če se Async uporablja neprevidno, lahko oteži branje nadzornega toka programa. Če imate eno vstopno točko za asinhrono kodo programa, se stvari ne bodo poraščale.

Async funkcije lahko razporedite tudi kotnalogeali predmeti, ki ovijejo koroutine in pomagajo pri njihovem zagonu.

async def my_task ():

naredi kaj()

task = asyncio.create_task (my_task ())

my_task () se nato zažene v zanki dogodka, rezultati pa se shranijo vnaloga.

Če imate samo eno nalogo, iz katere želite dobiti rezultate, jo lahko uporabiteasyncio.wait_for (naloga) počakajte, da se naloga konča, nato uporabitetask.result () da dobite njegov rezultat. Če pa ste načrtovali izvedbo številnih nalog in želite počakativse jih končati, uporabitiasyncio.wait ([naloga1, naloga2]) za zbiranje rezultatov. (Upoštevajte, da lahko nastavite časovno omejitev za operacije, če ne želite, da tečejo čez določen čas.)

Upravljajte asinhrono zanko dogodkov v Pythonu

Druga pogosta uporaba zaasincio je upravljanje asinhzanka dogodka. Zanka dogodkov je objekt, ki izvaja asinhnične funkcije in povratne klice; ustvari se samodejno, ko ga uporabiteasyncio.run (). Običajno želite uporabiti samo eno zanko asinhrskega dogodka na program, da bodo stvari še naprej obvladljive.

Če pišete naprednejšo programsko opremo, na primer strežnik, boste potrebovali dostop do zanke dogodka na nižji ravni. V ta namen lahko "dvignete kapuco" in delate neposredno z notranjimi elementi zanke dogodka. Toda za preprosta dela vam ne bo treba.

Branje in pisanje podatkov s tokovi v Pythonu

Najboljši scenariji za async so dolgotrajne omrežne operacije, kjer lahko aplikacija blokira čakanje, da nek drug vir vrne rezultat. V ta namenasincio ponuja tokove, ki so mehanizmi na visoki ravni za izvajanje omrežnih V / I. To vključuje delovanje strežnika za omrežne zahteve.

asincio uporablja dva razreda,StreamReader inStreamWriter, za branje in pisanje iz omrežja na visoki ravni. Če želite brati iz omrežja, uporabiteasyncio.open_connection () da odprete povezavo. Ta funkcija vrne nizStreamReader inStreamWriter predmete in bi jih uporabili.read () in.write () metode za komunikacijo.

Če želite prejemati povezave z oddaljenih gostiteljev, uporabiteasyncio.start_server (). The asyncio.start_server () funkcija kot argument vzame funkcijo povratnega klica,client_connected_cb, ki se pokliče vsakič, ko prejme zahtevo. Ta funkcija povratnega klica zavzame primereStreamReader in StreamWriter kot argumente, tako da lahko obravnavate logiko branja / pisanja za strežnik. (Tu si oglejte primer preprostega strežnika HTTP, ki uporabljaasincio-pogonaiohttp knjižnica.)

Sinhronizirajte opravila v Pythonu

Asinhrona opravila se običajno izvajajo ločeno, včasih pa boste želeli, da komunicirajo med seboj.asincio ponuja čakalne vrste in več drugih mehanizmov za sinhronizacijo med nalogami:

  • Čakalne vrsteasincio čakalne vrste omogočajo asinhrone funkcije, da razvrstijo predmete Python, da jih porabijo druge asinhrične funkcije - na primer za razporeditev delovnih obremenitev med različne vrste funkcij glede na njihovo vedenje.
  • Primitivi za sinhronizacijo: Ključavnice, dogodki, pogoji in semaforji v asincio delujejo kot njihovi običajni kolegi Python.

Pri vseh teh metodah morate imeti v mislih, da sone brez navojev. To ni težava pri asinhronih opravilih, ki se izvajajo v isti zanki dogodka. Če pa poskušate informacije deliti z nalogami v drugi zanki dogodka, niti OS ali postopku, boste morali uporabitinavojem modul in njegovi predmeti, da to storijo.

Nadalje, če želitekosilo koroutine čez meje niti, uporabiteasyncio.run_coroutine_threadsafe () funkcijo in posredujte zanko dogodka, da jo uporabite kot parameter.

Začasno ustavite program v Pythonu

Druga pogosta uporabaasincioin premalo razpravljano čaka nekaj časa v notranjosti koroteine. Ne morete uporabljatitime.sleep () ali pa boste blokirali celoten program. Namesto tega uporabiteasyncio.sleep (), ki omogoča nadaljnje izvajanje drugih programov.

Uporabite asinhronizacijo nižje ravni v Pythonu

Nazadnje, če menite, da bo morda potrebna aplikacija, ki jo sestavljate asincioKomponente nižjega nivoja, preden se začnete kodirati, se oglejte naokoli: Obstaja velika verjetnost, da je nekdo že zgradil async-powered Python knjižnico, ki naredi, kar potrebujete.

Če na primer potrebujete asinhrono poizvedovanje po DNS, preveriteaiodns za asinhrono SSH sejoasyncSSH. Poiščite PyPI po ključni besedi »async« (in druge ključne besede, povezane z opravili) ali pa poiščite predloge na ročno urejenem seznamu Awesome Asyncio.

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