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 vasincio
in 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 asyncioasync 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 vrste:
asincio
č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 uporabaasincio
in 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 asincio
Komponente 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.