Programiranje

3 koraki do prenove async Pythona

Python je eno izmed mnogih jezikov, ki podpirajo način pisanja asinhronih programov - programov, ki prosto preklapljajo med več nalogami, vse pa se izvajajo hkrati, tako da nobena naloga ne zadrži napredka drugih.

Verjetno ste napisali predvsem sinhrone programe Python - programe, ki naenkrat naredijo samo eno stvar in čakajo, da se vsaka naloga konča, preden zaženete drugo. Prehod na asinhronizacijo je lahko moteč, saj zahteva učenje ne samo nove skladnje, temveč tudi novih načinov razmišljanja o svoji kodi.

V tem članku bomo raziskali, kako lahko obstoječi sinhroni program spremenimo v asinhroni. To vključuje več kot le dekoriranje funkcij z asinhrono sintakso; zahteva tudi drugačno razmišljanje o tem, kako deluje naš program, in odločitev, ali je async sploh dobra metafora za to, kar počne.

[Tudi o: Naučite se nasvetov in trikov za Python iz videoposnetkov Smart Python Serdarja Yegulalpa]

Kdaj uporabiti async v Pythonu

Program Python je najprimernejši za asinhronizacijo, če ima naslednje značilnosti:

  • Poskuša narediti nekaj, kar je večinoma vezano na V / I ali čakanje na dokončanje nekega zunanjega procesa, kot je dolgotrajno branje omrežja.
  • Poskuša opraviti eno ali več tovrstnih nalog hkrati, obenem pa obvlada uporabniške interakcije.
  • Zadevne naloge niso računsko težke.

Program Python, ki uporablja navoje, je običajno dober kandidat za uporabo async. Niti v Pythonu sodelujejo; po potrebi popuščajo drug drugemu. Async naloge v Pythonu delujejo na enak način. Poleg tega async ponuja določene prednosti pred nitmi:

  • The asinh/čakati sintaksa omogoča enostavno prepoznavanje asinhronih delov vašega programa. Nasprotno pa je pogosto težko na hitro ugotoviti, kateri deli aplikacije se izvajajo v niti.
  • Ker imajo asinhrizna opravila isto nit, vse podatke, do katerih dostopajo, samodejno upravlja GIL (Pythonov izvorni mehanizem za sinhronizacijo dostopa do predmetov). Niti pogosto zahtevajo zapletene mehanizme za sinhronizacijo.
  • Asinhna opravila je lažje upravljati in preklicati kot niti.

Uporaba async je ne priporočljivo, če ima vaš program Python te značilnosti:

  • Naloge imajo visoke računske stroške - na primer izvajajo veliko drobljenje številk. Težko računsko delo je najbolje rešiti večprocesna obdelava, ki vam omogoča, da posvetite celoto strojne opreme nit za vsako nalogo.
  • Naloge nimajo koristi od prepletanja. Če je vsako opravilo odvisno od zadnjega, nima smisla, da bi se teklo asinhrono. Če program vključujekompleti serijskih nalog lahko vsak niz izvajate asinhrono.

1. korak: Določite sinhroni in asinhroni del vašega programa

Kodo Python async morajo zagnati in upravljati sinhroni deli aplikacije Python. V ta namen je vaša prva naloga pri pretvorbi programa v asinhrono risanje črte med sinhronizacijskim in asinhričnim delom vaše kode.

V prejšnjem članku o asinhronizaciji smo kot preprost primer uporabili aplikacijo za strganje spletnih strani. Asinhroni deli kode so rutine, ki odpirajo omrežne povezave in berejo s spletnega mesta - vse, kar želite prepletati. Toda del programa, ki začne vse to, ni asinhren; sproži naloge asinhronizacije in jih nato elegantno zapre, ko končajo.

Pomembno je tudi ločiti morebitneblokiranje iz async in ga shranite v sinhronizacijskem delu aplikacije. Branje uporabniških vnosov iz konzole na primer blokira vse, vključno z asinhronsko zanko dogodka. Zato želite uporabniški vnos obravnavati bodisi preden zaženete asinhronska opravila bodisi ko jih končate. (To je je mogoče uporabniški vnos obdelati asinhrono z več obdelavo ali navojem, vendar je to napredna vaja, pri kateri se tu ne bomo spuščali.)

Nekaj ​​primerov blokiranja:

  • Vhod v konzolo (kot smo pravkar opisali).
  • Naloge, ki vključujejo močno uporabo procesorja.
  • Uporaba čas.spa za premor. Upoštevajte, da lahko v funkciji asinh asyncio.spaj kot nadomestek za čas.spa.

2. korak: Pretvorite ustrezne sinhronizacijske funkcije v asinhnične funkcije

Ko veste, kateri deli vašega programa se bodo izvajali asinhrono, jih lahko razdelite na funkcije (če tega še niste storili) in jih spremenite v asinhronske funkcije s asinh ključna beseda. Nato boste morali sinhroni del aplikacije dodati kodo, da zaženete asinhrono kodo in po potrebi iz nje zberete rezultate.

Opomba: Preverite verigo klicev vsake funkcije, ki ste jo naredili asinhrono, in se prepričajte, da ne kličejo potencialno dolgotrajne ali blokirne operacije. Asinh. Funkcije lahko neposredno pokličejo sinhronizacijske funkcije in če ta sinhronizacijska funkcija blokira, to stori tudi asinh. Funkcija, ki jo pokliče.

Oglejmo si poenostavljen primer, kako lahko deluje pretvorba sinhronizacija v asinhronizacijo. Tu je naš program "prej":

def a_function (): # nekaj async-združljivega dejanja, ki traja nekaj časa def another_function (): # nekaj sinhronizacijske funkcije, ne pa tudi blokirnega def do_stuff (): a_function () another_function () def main (): za _ in range (3): do_stuff () glavni () 

Če želimo tri primerke do_stuff če želite zagnati asinhronska opravila, se moramo obrniti do_stuff (in morebiti vsega, česar se dotakne) v asinhrono kodo. Tu je prvi prehod pri pretvorbi:

import asyncio async def a_function (): # nekaj async združljivega dejanja, ki traja nekaj časa def another_function (): # nekaj sinhronizacijske funkcije, ne pa tudi blokirnega async def do_stuff (): počakajte na a_function () another_function () async def main ( ): tasks = [] za _ in range (3): tasks.append (asyncio.create_task (do_stuff ())) await asyncio.gather (tasks) asyncio.run (main ()) 

Upoštevajte spremembe, ki smo jih narediliglavni. Zdaj glavni uporablja asincio za zagon vsakega primerka do_stuff kot sočasno nalogo, nato počaka na rezultate (asyncio.gather). Prav tako smo se spreobrnili a_funkcija v async funkcijo, saj želimo vse primere a_funkcija teči vzporedno in ob drugih funkcijah, ki potrebujejo asinhrono vedenje.

Če bi radi šli še korak dlje, bi se lahko tudi spreobrnili druga_funkcija asinhronizirati:

async def another_function (): # nekaj sinhronizacijske funkcije, ne pa tudi blokirne async def do_stuff (): await a_function () await another_function () 

Vendar izdelavadruga_funkcija asinhrono bi bilo preveč, saj (kot smo že omenili) ne naredi ničesar, kar bi oviralo napredek našega programa. Tudi, če so poklicani kateri koli sinhroni deli našega programadruga_funkcija, morali bi jih pretvoriti tudi v asinhronizacijo, kar bi lahko naš program zapletlo bolj, kot bi bilo treba.

3. korak: Temeljito preizkusite svoj async program Python

Vsak asinhrono pretvorjen program je treba preizkusiti, preden začne delovati, da se prepriča, da deluje po pričakovanjih.

Če je vaš program skromne velikosti - recimo nekaj ducatov vrstic ali približno tako - in ne potrebuje celotnega testnega sklopa, potem ne bi smelo biti težko preveriti, ali deluje, kot je predvideno. Če pa program pretvarjate v asinhronizacijo kot del večjega projekta, kjer je testna zbirka standardna oprema, je smiselno, da napišete enotne teste za asinhronizacijske in sinhronizacijske komponente.

Oba glavna testna ogrodja v Pythonu imata zdaj nekakšno asinhrono podporo. Pythonovaunittest ogrodje vključuje predmete testnih primerov za asinhrične funkcije in pytest ponudbepytest-asyncio za iste konce.

Nazadnje, ko pišete teste za asinhrne komponente, boste morali kot pogoj testov obravnavati njihovo zelo asinhronost. Na primer, ni nobenega jamstva, da se bodo asinhorska opravila dokončala v vrstnem redu, kot so bila predložena. Prva bo morda prišla zadnja, nekatere pa morda sploh ne bodo dokončane. Vsi preskusi, ki jih načrtujete za funkcijo asinhronizacije, morajo te možnosti upoštevati.

Kako narediti več s Pythonom

  • Začnite z async v Pythonu
  • Kako uporabljati asyncio v Pythonu
  • Kako uporabiti PyInstaller za ustvarjanje izvršljivih datotek Python
  • Vadnica za Cython: Kako pospešiti Python
  • Kako namestiti Python na pameten način
  • Kako upravljati projekte Python s poezijo
  • Kako upravljati projekte Python s Pipenv
  • Virtualenv in venv: Razložena navidezna okolja Python
  • Python virtualenv in venv dela in ne sme
  • Razloženi navoji Python in podprocesi
  • Kako uporabljati razhroščevalnik Python
  • Kako uporabiti timeit za profiliranje kode Python
  • Kako uporabiti cProfile za profiliranje kode Python
  • Kako pretvoriti Python v JavaScript (in nazaj)
$config[zx-auto] not found$config[zx-overlay] not found