Ohjelmointi

3 vaihetta Pythonin asynkroniseen huoltoon

Python on yksi monista kielistä, jotka tukevat jotakin tapaa kirjoittaa asynkronisia ohjelmia - ohjelmia, jotka vaihtavat vapaasti useiden tehtävien välillä, kaikki käynnissä kerralla, joten kukaan tehtävä ei pidä muiden etenemistä.

Mahdollisuudet ovat kuitenkin, että olet lähinnä kirjoittanut synkronisia Python-ohjelmia - ohjelmia, jotka tekevät vain yhtä asiaa kerrallaan, odottaen kunkin tehtävän päättymistä ennen toisen aloittamista. Asynkronointiin siirtyminen voi olla haastavaa, koska se edellyttää uuden syntaksin lisäksi myös uusien tapojen miettimistä koodista.

Tässä artikkelissa tutkitaan, kuinka olemassa olevasta synkronisesta ohjelmasta voidaan tehdä asynkroninen. Tähän sisältyy muutakin kuin toimintojen koristelu asynkronisyntaksilla; se edellyttää myös ajattelua eri tavalla siitä, miten ohjelmamme toimii, ja päättää, onko asynkronointi edes hyvä metafora toiminnalleen.

[Myös: Opi Python-vinkkejä Serdar Yegulalpin Smart Python -videoista]

Milloin käyttää asynkronointia Pythonissa

Python-ohjelma sopii parhaiten asynkronointiin, kun sillä on seuraavat ominaisuudet:

  • Se yrittää tehdä jotain, joka on enimmäkseen sidottu I / O: hon tai odottamalla jonkin ulkoisen prosessin päättymistä, kuten pitkäaikainen verkon lukeminen.
  • Se yrittää tehdä yhtä tai useampaa tällaista tehtävää kerralla, mutta mahdollisesti myös käsitellä käyttäjien vuorovaikutusta.
  • Kyseiset tehtävät eivät ole laskennallisesti raskaita.

Langoittamista käyttävä Python-ohjelma on tyypillisesti hyvä ehdokas asynkronointiin. Pythonin säikeet ovat yhteistyökykyisiä; he antautuvat toisilleen tarpeen mukaan. Pythonin asynkronointitehtävät toimivat samalla tavalla. Lisäksi asynkronointi tarjoaa tiettyjä etuja ketjuihin nähden:

  • asynkronoitu/odottaa syntaksin avulla on helppo tunnistaa ohjelman asynkroniset osat. Sitä vastoin on usein vaikea kertoa yhdellä silmäyksellä, mitkä sovelluksen osat suoritetaan ketjussa.
  • Koska asynkronointitehtävillä on sama ketju, kaikkia heidän käyttämiään tietoja hallinnoi GIL (Pythonin natiivimekanismi objektien käytön synkronoimiseksi) automaattisesti. Langat vaativat usein monimutkaisia ​​synkronointimekanismeja.
  • Asynkronointitehtäviä on helpompi hallita ja peruuttaa kuin ketjuja.

Async on ei suositellaan, jos Python-ohjelmallasi on seuraavat ominaisuudet:

  • Tehtävillä on korkeat laskennalliset kustannukset - esimerkiksi he tekevät paljon numeromurskauksia. Raskas laskennallinen työ on parasta hoitaa moniprosessointi, jonka avulla voit omistaa kokonaisen laitteisto ketju jokaiseen tehtävään.
  • Tehtävät eivät hyödy lomituksesta. Jos jokainen tehtävä riippuu viimeisestä, ei ole mitään syytä panna niitä suorittamaan asynkronisesti. Se sanoi, jos ohjelmaan liittyysarjat sarjatehtävistä, voit suorittaa jokaisen sarjan asynkronisesti.

Vaihe 1: Tunnista ohjelman synkroniset ja asynkroniset osat

Python-asynkronikoodin on oltava Python-sovelluksesi synkronisten osien käynnistämä ja hallinnoima. Tätä varten ensimmäinen tehtäväsi muunnettaessa ohjelma asynkroniksi on piirtää viiva koodisi synkronointi- ja asynkronointiosien välille.

Aikaisemmassa asynkronointia koskevassa artikkelissamme käytimme verkkokaaviosovellusta yksinkertaisena esimerkkinä. Koodin asynkroniset osat ovat rutiineja, jotka avaavat verkkoyhteydet ja lukevat sivustolta - kaikki mitä haluat lomittaa. Mutta se osa ohjelmasta, joka potkaisee kaiken, ei ole asynkronoitu; se käynnistää asynkronointitehtävät ja sulkee ne sitten sulavasti niiden valmistuttua.

On myös tärkeää erottaa kaikki mahdollisetestotoiminto asynkronoinnista ja pidä se sovelluksesi synkronointiosassa. Esimerkiksi käyttäjän syötteen lukeminen konsolista estää kaiken, mukaan lukien asynkronoitujen tapahtumien silmukka. Siksi haluat käsitellä käyttäjän syötteitä joko ennen asynkronointitehtävien käynnistämistä tai niiden suorittamisen jälkeen. (Se On on mahdollista käsitellä käyttäjän syötteitä asynkronisesti moniprosessoinnin tai ketjutuksen avulla, mutta se on edistynyt harjoitus, johon emme pääse tässä.)

Joitakin esimerkkejä estotoiminnoista:

  • Konsolin syöttö (kuten juuri kuvasimme).
  • Tehtävät, joihin liittyy paljon suorittimen käyttöä.
  • Käyttämällä aika. nukkunut pakottaa tauko. Huomaa, että voit nukkua asynkronitoiminnon sisällä käyttämällä asyncio. nukkunut korvikkeena aika. nukkunut.

Vaihe 2: Muunna sopivat synkronointitoiminnot asynkronitoimintoiksi

Kun tiedät, mitkä ohjelman osat suoritetaan asynkronisesti, voit jakaa ne toimintoihin (jos et ole jo tehnyt niin) ja muuttaa niistä asynkronointitoimintoja asynkronoitu avainsana. Sitten sinun on lisättävä koodi sovelluksesi synkroniseen osaan, jotta voit suorittaa asynkronikoodin ja kerätä siitä tarvittaessa tuloksia.

Huomaa: Sinun kannattaa tarkistaa jokaisen asynkroniseksi tekemäsi toiminnon puheluketju ja varmistaa, että ne eivät vetoa mahdollisesti pitkään jatkuneeseen tai estävään toimintaan. Asynkronitoiminnot voivat kutsua suoraan synkronointitoimintoja, ja jos kyseinen synkronointitoiminto estyy, niin tekee myös sitä kutsuva asynkronitoiminto.

Tarkastellaan yksinkertaistettua esimerkkiä synkronoinnin ja asynkronoinnin muunnoksen toiminnasta. Tässä on "ennen" -ohjelma:

def a_function (): # jokin asynkronin kanssa yhteensopiva toimenpide, joka kestää jonkin aikaa def another_function (): # jokin synkronointitoiminto, mutta ei yhden def do_stuff (): a_function () another_function () def main (): -alueelle _ alueella (3): do_stuff () main () 

Jos haluamme kolme tapausta tehdä asioita Async-tehtävien suorittamiseksi meidän on käännyttävä tehdä asioita (ja mahdollisesti kaiken, mitä se koskettaa) asynkronikoodiksi. Tässä on ensimmäinen tulos muunnoksessa:

tuo asyncio async def a_function (): # jotkut async-yhteensopivat toiminnot, jotka vievät jonkin aikaa def another_function (): # jotkut synkronointitoiminnot, mutta eivät estä async def do_stuff (): odota a_function () another_function () async def main ( ): tehtävät = [] _ ​​alueella (3): task.append (asyncio.create_task (do_stuff ())) odottaa asyncio.gather (tehtävät) asyncio.run (main ()) 

Huomaa tekemämme muutoksettärkein. Nyt tärkein käyttää asyncio käynnistää kukin tehdä asioita samanaikaisena tehtävänä odottaa sitten tuloksia (asyncio.gather). Olemme myös käännyttäneet a_toiminto Async-funktioksi, koska haluamme kaikki a_toiminto juosta vierekkäin ja muiden toimintojen rinnalla, jotka tarvitsevat asynkronointikäyttäytymistä.

Jos haluaisimme mennä askeleen pidemmälle, voimme myös kääntyä toinen_toiminto asynkronoida:

async def another_function (): # jokin synkronointitoiminto, mutta ei estävä async def do_stuff (): odota a_function () odota another_function () 

Kuitenkin tekeminentoinen_toiminto asynkroninen olisi ylivoimaista, koska (kuten olemme huomauttaneet) se ei tee mitään, mikä estäisi ohjelmamme etenemisen. Lisäksi, jos jokin ohjelmamme synkroninen osa kutsutaantoinen_toiminto, meidän on myös muunnettava ne asynkroniksi, mikä voi tehdä ohjelmastamme monimutkaisemman kuin sen pitäisi olla.

Vaihe 3: Testaa Python-asynkronointiohjelma perusteellisesti

Kaikki asynkronoituna muunnetut ohjelmat on testattava ennen niiden aloittamista tuotantoon varmistaakseen, että ne toimivat odotetusti.

Jos ohjelma on kooltaan vaatimaton - esimerkiksi pari tusinaa riviä - eikä tarvitse täydellistä testipakettia, ei pitäisi olla vaikeaa varmistaa, että se toimii tarkoitetulla tavalla. Siitä huolimatta, jos muunnat ohjelman asynkronoinniksi osana suurempaa projektia, jossa testipaketti on vakiovaruste, on järkevää kirjoittaa yksikkötestit sekä asynkronointia että synkronointia varten.

Molemmissa Pythonin tärkeimmissä testikehyksissä on nyt jonkinlainen asynkronointituki. Pythonin omayksikkötesti kehys sisältää testitapauksen asynkronointitoimintoja ja pytest tarjoaapytest-asyncio samoihin päämääriin.

Lopuksi, kirjoittaessasi asynkronisten komponenttien testejä, sinun on käsiteltävä niiden asynkronisuutta testien ehtona. Esimerkiksi ei voida taata, että asynkronoidut työt valmistuvat lähetysjärjestyksessä. Ensimmäinen saattaa tulla viimeiseksi, ja jotkut eivät ehkä koskaan päätä ollenkaan. Asynkronitoimintoa varten suunnitelluissa testeissä on otettava nämä mahdollisuudet huomioon.

Kuinka tehdä enemmän Pythonilla

  • Aloita asynkronointi Pythonissa
  • Asyncion käyttäminen Pythonissa
  • Kuinka käyttää PyInstalleria Python-suoritettavien tiedostojen luomiseen
  • Cython-opetusohjelma: Kuinka nopeuttaa Pythonia
  • Kuinka asentaa Python älykkäästi
  • Kuinka hallita Python-projekteja Poetryn avulla
  • Kuinka hallita Python-projekteja Pipenv: llä
  • Virtualenv ja venv: Python-virtuaaliympäristöt selitetty
  • Python virtualenv ja venv do and don'ts
  • Python-ketjuttaminen ja aliprosessit on selitetty
  • Kuinka käyttää Python-virheenkorjainta
  • Kuinka käyttää timeit Python-koodin profilointiin
  • CProfilen käyttäminen Python-koodin profilointiin
  • Kuinka muuntaa Python JavaScriptiksi (ja takaisin)