Programavimas

Kaip naudoti „asyncio“ Python

Asinchroninė „Python“ programavimo funkcionalumas arba trumpai tariant „asinchronizavimas“ leidžia rašyti programas, kurios daugiau dirba, nelaukdamos, kol baigsis savarankiškos užduotys. asyncio biblioteka, įtraukta į „Python“, suteikia įrankius, skirtus naudoti „asinchroninį“ apdorojant diską ar tinklo įvestį / išvestį, nelaukiant viso kito.

asyncio teikia dviejų rūšių API, skirtas asinchroninėms operacijoms tvarkyti:aukštas lygis iržemas lygis. Aukšto lygio API yra dažniausiai naudingos ir jos taikomos įvairiausioms programoms. Žemo lygio API yra galingos, tačiau sudėtingos ir naudojamos rečiau.

Šiame straipsnyje daugiausia dėmesio skirsime aukšto lygio API. Toliau pateiktose skiltyse apžvelgsime dažniausiai naudojamas aukšto lygio APIasyncioir parodykite, kaip juos galima naudoti įprastoms operacijoms, susijusioms su asinchroninėmis užduotimis.

Jei esate visiškai naujas „Python“ asinchronizavimo būdas arba galėtumėte naudoti atnaujinimo būdą, kaip jis veikia, prieš pasinerdami čia perskaitykite mano įvadą į „Python“ asinchronizavimą.

Paleiskite „Coroutines“ ir „Python“ užduotis

Natūralu, kad dažniausiai naudojamas asyncio yra paleisti asinchronines „Python“ scenarijaus dalis. Tai reiškia išmokti dirbti su korutinais ir užduotimis.

„Python“ asinchroniniai komponentai, įskaitant programas ir užduotis, gali būti naudojami tik su kitais asinchroniniais komponentais, o ne su įprastu sinchroniniu „Python“, taigi jums reikiaasyncio įveikti spragą. Norėdami tai padaryti, naudokiteasyncio.run funkcija:

importuoti asyncio

„async def main“ ():

spausdinti („Laukiu 5 sekundes“)

už _ diapazone (5):

laukti asyncio.sleep (1)

spausdinti (".")

spausdinti („Baigta laukti“.)

asyncio.run (main ())

Tai veikiapagrindinis (), kartu su bet kokiais korutinaispagrindinis () užsidega ir laukia, kol grįš rezultatas.

Paprastai „Python“ programoje turėtų būti tik viena.run () pareiškimas, kaip ir „Python“ programa turėtų turėti tik vienąpagrindinis () funkcija. Async, jei naudojamas nerūpestingai, gali apsunkinti programos valdymo srautą. Turėdami vieną įvesties tašką į programos asinchroninį kodą, viskas netampa plaukuota.

Async funkcijas taip pat galima suplanuoti kaipužduotys, arba daiktai, kurie suvynioja koroutines ir padeda jas paleisti.

async def my_task ():

do_something ()

task = asyncio.create_task (mano_užduotis ())

mano_duotis () tada vykdoma įvykių cikle, o jo rezultatai saugomiužduotis.

Jei turite tik vieną užduotį, iš kurios norite gauti rezultatų, galite naudotiasyncio.wait_for (užduotis) palaukite, kol užduotis bus baigta, tada naudokitetask.rezultatas () kad gautų jo rezultatą. Bet jei suplanavote atlikti daugybę užduočių ir norite palauktivisi iš jų baigti, naudotiasyncio.wait ([task1, task2]) surinkti rezultatus. (Atminkite, kad galite nustatyti operacijų skirtąjį laiką, jei nenorite, kad jos būtų vykdomos per tam tikrą laiką.)

„Python“ valdykite asinchroninio įvykio kilpą

Kitas įprastas naudojimasasyncio yra valdyti asinchronąįvykio kilpa. Įvykių ciklas yra objektas, vykdantis asinchronines funkcijas ir atgalinius skambučius; jis sukuriamas automatiškai, kai naudojateasyncio.run (). Paprastai norite naudoti tik vieną asinchroninių įvykių ciklą kiekvienai programai, kad viskas būtų tvarkoma.

Jei rašote pažangesnę programinę įrangą, pvz., Serverį, jums reikės žemesnio lygio prieigos prie įvykių ciklo. Tuo tikslu galite "pakelti gaubtą" ir dirbti tiesiogiai su renginio kilpos vidiniais elementais. Bet paprastiems darbams jums nereikės.

Skaitykite ir rašykite duomenis naudodami „Python“ srautus

Geriausi asinchroninio scenarijaus atvejai yra ilgai vykdomos tinklo operacijos, kai programa gali blokuoti laukimą, kol kitas šaltinis grąžins rezultatą. Link tokios baigties,asyncio siūlo srautus, kurie yra aukšto lygio tinklo įvesties / išvesties mechanizmai. Tai apima veikimą kaip tinklo užklausų serverį.

asyncio naudoja dvi klases,„StreamReader“ ir„StreamWriter“, skaityti ir rašyti iš tinklo aukštu lygiu. Jei norite skaityti iš tinklo, naudositeasyncio.open_connection () norėdami atidaryti ryšį. Ta funkcija pateikia porą„StreamReader“ ir„StreamWriter“ objektus, ir jūs naudotumėte.skaityti () ir.write () metodus kiekvienam bendrauti.

Norėdami gauti ryšius iš nuotolinių kompiuterių, naudokiteasyncio.start_server (). asyncio.start_server () funkcija kaip argumentą laiko atgalinio skambinimo funkciją,client_connected_cb, kuris iškviečiamas, kai gauna užklausą. Ta atgalinio ryšio funkcija užima„StreamReader“ ir „StreamWriter“ kaip argumentus, todėl galite tvarkyti serverio skaitymo / rašymo logiką. (Čia rasite paprasto HTTP serverio, kuris naudoja., Pavyzdįasyncio-varomasaiohttp biblioteka.)

Sinchronizuokite „Python“ užduotis

Asinchroninės užduotys paprastai vykdomos atskirai, tačiau kartais norėsite, kad jos bendrautų tarpusavyje.asyncio pateikiamos eilės ir keli kiti mechanizmai, skirti sinchronizuoti užduotis:

  • Eilėsasyncio eilės leidžia asinchroninėms funkcijoms surikiuoti „Python“ objektus, kuriuos sunaudoja kitos asinchroninės funkcijos, pavyzdžiui, paskirstyti darbo krūvius tarp skirtingų funkcijų, atsižvelgiant į jų elgesį.
  • Sinchronizavimo pradmenys: Spynos, įvykiai, sąlygos ir semaforai asyncio veikia kaip įprasti „Python“ kolegos.

Visų šių metodų metu reikia atsiminti vieną dalykąne siūlai saugūs. Tai nėra problema dėl asinchroninių užduočių, vykdomų toje pačioje įvykių cikle. Bet jei bandote dalytis informacija su kitomis įvykių grandinėmis, OS gijomis ar procesais esančiomis užduotimis, turėsite naudotisriegimas modulis ir jo objektai tai padaryti.

Toliau, jei noritepaleidimas korutines per sriegio ribas, naudokiteasyncio.run_coroutine_threadsafe () funkciją ir perduokite įvykio kilpą, kad galėtumėte ją naudoti kaip parametrą.

Pristabdykite „Python“ programą

Kitas įprastasasyncioir nepakankamai aptartas laukia savavališko laiko korutine. Jūs negalite naudotilaikas. miegoti () tai užblokuosite visą programą. Verčiau naudokiteasyncio.sleep (), leidžiančią toliau vykdyti kitus korutinus.

„Python“ naudokite žemesnio lygio asinchronizavimą

Galiausiai, jei manote, kad jūsų kuriamai programai gali prireikti asyncioŽemesnio lygio komponentus, prieš pradėdami koduoti, apsižvalgykite: Yra didelė tikimybė, kad kažkas jau sukūrė „asinchroninio“ Python biblioteką, kuri daro tai, ko jums reikia.

Pvz., Jei jums reikia asinchroninio DNS užklausų, patikrinkiteaiodnai biblioteka ir asinchroniniams SSH seansamsasyncSSH. Ieškokite „PyPI“ pagal raktinį žodį „async“ (be kitų su užduotimi susijusių raktinių žodžių) arba patikrinkite rankiniu būdu sudarytą „Awesome Asyncio“ sąrašą.

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