Korutiinit ovat periaatteessa funktioita, joiden suoritus voidaan keskeyttää/keskeyttää tietyssä pisteessä, ja sitten voimme jatkaa suoritusta samasta pisteestä myöhemmin milloin haluamme.

tarvitsemme mekanismin — tai tarkemmin sanottuna avainsanan-jolla voimme lisätä tarkistuspisteen ja kertoa ohjelmalle, että haluamme keskeyttää funktion suorittamisen tähän ja palauttaa ohjauksen siihen pisteeseen, josta se kutsui. Jatkamme teloitusta milloin haluamme.

Pythonissa funktion suorituksen voi keskeyttää yield – hakusanalla.

näin asiat muuttuvat kiinnostaviksi:

  • voimme ajatella coroutinea funktiona, jossa on yksi tai useampi tarkastuspiste, jossa suoritus keskeytetään ja ohjaus palautetaan siihen kohtaan, josta se kutsuttiin.
  • pohjimmiltaan korutiini on funktio, joka on jaettu moneen osaan, ja voimme suorittaa jokaisen korutiinin osan suorittaessamme jokaisen for-silmukan iteraation käyttäen next funktiota.

tässä perusesimerkki:

OUTPUT :<class 'generator'>
Function Starts
Function Ends

ulostulosta huomaamme muutamia asioita:

  • ensin täytyy kutsua coroutine/funktio, joka antaa meille generaattoriobjektin.
  • tuo generaattoriobjekti käyttäytyy samalla tavalla kuin iteraattori, mutta iteraattorin tapauksessa kuljemme iteroituvan yli. Generaattorilla suoritamme osia coroutinesta.
  • aivan kuten StopIteration poikkeus heitetään ja jää kiinni for Loopin kulissien taakse, sama tapahtuu tässäkin tapauksessa, kun koroutin viimeinen osa toteutetaan.

nyt tämä funktion keskeytys välillä on hyvin mielenkiintoinen ja avaa joitakin mahdollisuuksia:

  • kun funktio on keskeytetty, emme tee mitään, minkä juuri näimme.
  • Oletetaan, että muuttujaa muokataan useita kertoja funktiossa ja haluamme tietyn muuttujan arvon tietyllä tarkistuspisteellä. Kun pysäytämme funktion, se palauttaa muuttujan arvon.

katsotaan esimerkki:

OUTPUT :Function Part 1
5
Function part 2
12
Function part 3

tässä arvon x palauttaa yield eri tarkistuspisteissä, koska funktion suoritus on keskeytetty.

aina kun suoritamme funktion viimeistä osaa eikä funktiossa ole enää satoa jäljellä, kyseisen viimeisen osan suorittamisen jälkeen nostetaan StopIteration poikkeus.

samaan tapaan kuin iteraattorin yrittäessä suorittaa seuraavaa funktiota, mutta iteroitavassa ei ole enää jäljellä elementtejä, se nostaa myös StopIteration poikkeuksen.

  • Oletetaan, että haluamme lähettää arvon (joka voi olla vakio tai muuttuja) tietyssä tarkastuspisteessä (eli tietyssä funktion tilassa). Sen voi tehdä myös yield – hakusanalla. Kun haluamme lähettää arvon, käytämme send funktiota nextsijasta.

katsotaan esimerkki:

OUTPUT :Function part 1
6
Function part 2
12
Function part 3

syy, miksi käytimme next ennen send käyttöä, on se, että voimme käyttää send vain silloin, kun olemme yield tarkistuspisteessä, ja yield on lausekkeen oikealla puolella. Jotta siis päästäisiin tuohon ensimmäiseen yield, on käytettävä funktiota next.

nyt tulee mielenkiintoinen korutiivien sovellus. Oletetaan, että haluamme vaihtaa edestakaisin kahden funktion välillä, kuten teemme monilukutekniikassa. Monilukuisena, kunnes käyttöjärjestelmä kohtaa interrupt: n, se jatkaa suorittamistaan. Tässä tapauksessa voimme vaihtaa milloin haluamme.

Katsotaanpa esimerkkiä:

OUTPUT :Function 1 part 1
Function 2 part 1
Function 1 part 2
Function 1 part 3
Function 2 part 2
Function 2 part 3
Function 2 part 4
Function 1 part 4
Function 1 part 5

tässä esimerkissä voimme nähdä, että voimme vaihtaa edestakaisin coroutines milloin haluamme.

joten jos kirjoitamme oman räätälöidyn ajastimen, joka hoitaa useiden korutinoiden välisen vaihdon, voimme saavuttaa yhdellä kierteellä sen, mitä teemme monilukutekniikalla.

Coroutineilla on monia sovelluksia, kuten yhtäaikaisuus ja myös muita ohjelmointimalleja voidaan toteuttaa, kuten tuottaja-kuluttaja tai lähettäjä-vastaanotin verkko-ohjelmoinnissa. Aion tutkia niitä tulevissa artikkeleissa.

Korutiinit ovat myös monien kehysten, kuten asyncion, twistedin, aiohttp: / / www. Niitä voidaan myös ketjuttaa yhteen putkistojen tekemiseksi ja ongelmien ratkaisemiseksi.