Ohjelmointi

Asyncion käyttäminen Pythonissa

Pythonin asynkroninen ohjelmointitoiminto tai lyhyt asynkronointi antaa sinun kirjoittaa ohjelmia, jotka saavat enemmän työtä tekemättä odottamatta itsenäisten tehtävien päättymistä. asyncio Pythonin mukana toimitettu kirjasto antaa sinulle työkalut asynkronointiin levyn tai verkon I / O: n käsittelemiseksi tekemättä kaikkea muuta odottamaan.

asyncio tarjoaa kahdenlaisia ​​sovellusliittymiä asynkronisten operaatioiden käsittelemiseksi:korkeatasoinen jamatala taso. Korkean tason sovellusliittymät ovat yleisesti hyödyllisiä, ja niitä voidaan soveltaa useimpiin sovelluksiin. Matalan tason sovellusliittymät ovat tehokkaita, mutta myös monimutkaisia ​​ja niitä käytetään harvemmin.

Keskitymme tässä artikkelissa korkean tason sovellusliittymiin. Seuraavissa osioissa käydään läpi yleisimmin käytetyt korkean tason sovellusliittymätasyncioja näytä, kuinka niitä voidaan käyttää yleisiin toimintoihin, joihin liittyy asynkronisia tehtäviä.

Jos olet täysin uusi asynkronoinnissa Pythonissa tai voisit käyttää päivitystä sen toimintaan, lue johdanto Pythonin asynkronointiin ennen sukellusta täällä.

Suorita korutiinit ja tehtävät Pythonissa

Luonnollisesti yleisin käyttö asyncio on suorittaa Python-komentosarjosi asynkroniset osat. Tämä tarkoittaa oppimista työskentelemään korutiinien ja tehtävien kanssa.

Pythonin asynkronointikomponentteja, mukaan lukien korutiineja ja tehtäviä, voidaan käyttää vain muiden asynkronointikomponenttien kanssa, ei perinteisen synkronisen Pythonin kanssa, joten tarvitsetasyncio kuilun poistamiseksi. Voit tehdä tämän käyttämälläasyncio.run toiminto:

tuoda asyncio

async def main ():

tulosta ("Odottaa 5 sekuntia.")

_ alueella (5):

odota asyncio.sleep (1)

Tulosta (".")

tulosta ("Odotus valmis.")

asyncio.run (main ())

Tämä toimiimain (), sekä kaikki korutiinitmain () syttyy ja odottaa tuloksen palaamista.

Python-ohjelmassa tulisi yleensä olla vain yksi.juosta() käsky, aivan kuten Python-ohjelmalla pitäisi olla vain yksimain () toiminto. Async, jos sitä käytetään huolimattomasti, voi tehdä ohjelman ohjausvirrasta vaikeasti luettavaa. Jos sinulla on yksi pääsykohta ohjelman asynkronikoodiin, asiat eivät karvaudu.

Asynkronointitoiminnot voidaan ajoittaa myös nimellätehtäviätai esineitä, jotka käärivät korutiineja ja auttavat niiden suorittamisessa.

async def my_task ():

tee jotain()

task = asyncio.create_task (oma_tehtävä ())

minun tehtäväni() suoritetaan sitten tapahtumasilmukassa, ja tulokset tallennetaantehtävä.

Jos sinulla on vain yksi tehtävä, josta haluat saada tuloksia, voit käyttää sitäasyncio.wait_for (tehtävä) odota tehtävän päättymistä ja käytä sittentehtävä.tulos () hakea sen tulos. Mutta jos olet määrittänyt suoritettavaksi useita tehtäviä ja haluat odottaakaikki niistä loppuun, käyttöönasyncio.wait ([tehtävä1, tehtävä2]) kerätä tuloksia. (Huomaa, että voit asettaa aikakatkaisun toiminnoille, jos et halua niiden kuluvan tietyn ajan yli.)

Hallitse asynkronoitua tapahtumasilmukkaa Pythonissa

Toinen yleinen käyttöasyncio on hallita asynkronointiatapahtumasilmukka. Tapahtumasilmukka on objekti, joka suorittaa asynkronointitoimintoja ja takaisinsoittoja; se luodaan automaattisesti, kun käytätasyncio.run (). Haluat yleensä käyttää vain yhtä asynkronoitua tapahtumasilmukkaa ohjelmaa kohden, jotta asiat pysyvät hallittavissa.

Jos kirjoitat kehittyneempiä ohjelmistoja, kuten palvelinta, tarvitset alemman tason käyttöoikeuden tapahtumasilmukkaan. Tätä varten voit "nostaa konepellin" ja työskennellä suoraan tapahtumasilmukan sisäosien kanssa. Mutta yksinkertaisia ​​töitä varten sinun ei tarvitse.

Lukea ja kirjoittaa tietoja virroilla Pythonissa

Asynkronoinnin parhaat skenaariot ovat pitkään jatkuneet verkkotoiminnot, joissa sovellus saattaa estää jonkun muun resurssin odottamisen tuloksen palauttamiseksi. Tätä vartenasyncio tarjoaa virtoja, jotka ovat korkean tason mekanismeja verkon I / O: n suorittamiseksi. Tähän sisältyy toimiminen palvelimena verkkopyyntöjä varten.

asyncio käyttää kahta luokkaa,StreamReader jaStreamWriter, lukea ja kirjoittaa verkosta korkealla tasolla. Jos haluat lukea verkosta, käytäasyncio.open_connection () yhteyden avaamiseksi. Tämä funktio palauttaa kaksinkertaisenStreamReader jaStreamWriter esineitä, ja käyttäisit.lukea() ja.kirjoittaa() tapoja kommunikoida.

Käytä, kun haluat vastaanottaa yhteyksiä etäisännöiltäasyncio.start_server (). asyncio.start_server () funktio ottaa argumenttina takaisinsoittofunktion,client_connected_cb, johon soitetaan aina, kun se vastaanottaa pyynnön. Tämä takaisinsoittotoiminto ottaa ilmentymiäStreamReader ja StreamWriter argumentteina, joten voit käsitellä palvelimen luku- / kirjoituslogiikkaa. (Katso tästä esimerkki yksinkertaisesta HTTP-palvelimesta, joka käyttääasyncio-ohjattuaiohttp kirjasto.)

Synkronoi tehtävät Pythonissa

Asynkroniset tehtävät suoritetaan yleensä erillään, mutta joskus haluat niiden kommunikoivan keskenään.asyncio tarjoaa jonoja ja useita muita mekanismeja tehtävien väliseen synkronointiin:

  • Jonotasyncio jonot antavat asynkronisten toimintojen asettaa jonoon Python-objektit, joita muut asynkroniset toiminnot kuluttavat - esimerkiksi jakaa työmäärät erilaisten toimintojen välillä käyttäytymisensä perusteella.
  • Synkronointiprimitiivit: Lukot, tapahtumat, olosuhteet ja semaforit kohteessa asyncio toimivat kuten tavanomaiset Python-kollegansa.

Yksi asia, joka on pidettävä mielessä kaikista näistä menetelmistä, on, että ne ovatei kierre turvallinen. Tämä ei ole ongelma asynkronisissa tehtävissä, jotka suoritetaan samassa tapahtumasilmukassa. Mutta jos yrität jakaa tietoja tehtävien kanssa eri tapahtumasilmukassa, käyttöjärjestelmän ketjussa tai prosessissa, sinun on käytettäväpujottaminen moduuli ja sen objektit.

Edelleen, jos haluattuoda markkinoille Korutiinit langan rajojen yli, käytäasyncio.run_coroutine_threadsafe () ja välitä tapahtumasilmukka käytettäväksi sen kanssa parametrina.

Keskeytä korutiini Pythonissa

Toinen yleinen käyttöasyncioja aliedustettu odottaa jonkin mielivaltaisen ajan korutiinin sisällä. Et voi käyttäätime.sleep () tätä varten, tai estät koko ohjelman. Käytä sen sijaanasyncio.sleep (), jonka avulla muut korutiinit voivat jatkaa toimintaansa.

Käytä alemman tason asynkronointia Pythonissa

Lopuksi, jos luulet rakentamasi sovelluksen vaativan asyncioAlemman tason komponentit, katsokaa ympärillesi ennen kuin aloitat koodaamisen: On hyvät mahdollisuudet, että joku on jo rakentanut asynksipohjaisen Python-kirjaston, joka tekee mitä tarvitset.

Jos esimerkiksi tarvitset asynkronisen DNS-kyselyn, tarkistajodit kirjasto ja asynkronoituja SSH-istuntoja vartenasyncSSH. Hae PyPI: stä avainsanalla "async" (plus muut tehtävään liittyvät avainsanat) tai etsi käsin kuratoitu Awesome Asyncio -luettelosta ideoita.