a Coroutines alapvetően olyan funkciók, amelyek végrehajtása szüneteltethető/felfüggeszthető egy adott ponton, majd később folytathatjuk a végrehajtást ugyanarról a pontról, amikor csak akarjuk.

szükségünk van egy mechanizmusra — pontosabban egy kulcsszóra—, amellyel beilleszthetünk egy ellenőrző pontot, és megmondhatjuk a programnak, hogy itt szüneteltetni akarjuk a függvény végrehajtását, és visszaadjuk a vezérlést arra a pontra, ahonnan hívott. Akkor folytatjuk a kivégzést, amikor csak akarjuk.

Pythonban szüneteltethetjük egy függvény végrehajtását a yield kulcsszó használatával.

tehát itt van, ahol a dolgok érdekessé válnak:

  • a coroutine-ra úgy gondolhatunk, mint egy függvényre, amelynek egy vagy több ellenőrző pontja van, ahol a végrehajtás szünetel, és az ellenőrzés visszatér arra a pontra, ahonnan hívták.
  • lényegében a coroutine egy olyan függvény, amely több részre oszlik, és a coroutine minden részét végrehajthatjuk, amikor a for hurok minden iterációját végrehajtjuk a next függvény segítségével.

Íme egy alapvető példa:

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

a kimenetből néhány dolgot észlelünk:

  • először meg kell hívnunk a coroutine/függvényt, amely generátor objektumot ad nekünk.
  • ez a generátorobjektum hasonlóan fog viselkedni, mint egy iterátor, de egy iterátor esetében egy iterálón haladunk át. Egy generátorral a coroutine egyes részeit hajtjuk végre.
  • ahogy egy StopIteration kivételt dobnak a For hurok kulisszái mögé, ugyanez történik ebben az esetben is, amikor a coroutine utolsó részét végrehajtják.

most ez a szünet a funkció között nagyon érdekes, és nyit néhány lehetőséget:

  • amikor a funkció szünetel, nem teszünk semmit, ami az imént látott eset.
  • tegyük fel, hogy egy változó többször módosul egy függvényben, és az adott változó értékét akarjuk egy bizonyos ellenőrzőponton. Ezután, amikor szüneteltetjük ezt a funkciót az adott ellenőrzőponton, visszaadja a változó értékét.

lássunk egy példát:

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

itt a x értéket yield adja vissza a különböző ellenőrző pontokon, mivel a funkció végrehajtása szünetel.

amikor a függvény utolsó részét hajtjuk végre, és nem marad hozam a függvényben, az utolsó rész végrehajtása után StopIteration kivétel emelkedik.

hasonlóan ahhoz, amikor egy iterátor megpróbálja végrehajtani a következő függvényt, de nincs több elem az iterálóban, felveti a StopIteration kivételt is.

  • tegyük fel, hogy egy értéket akarunk küldeni (amely lehet állandó vagy változó) egy bizonyos ellenőrzőponton (azaz egy függvény bizonyos állapotában). Ezt a yield kulcsszóval is megtehetjük. Ha értéket akarunk küldeni, akkor a send függvényt használjuk a nexthelyett.

lássunk egy példát:

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

azért használtuk a next – t a send használata előtt, mert csak akkor használhatjuk a send – t, ha az yield ellenőrzőpontnál vagyunk, és az yield a kifejezés jobb oldalán található. Tehát az első yield eléréséhez a next függvényt kell használnunk.

most itt jön egy érdekes alkalmazása coroutines. Tegyük fel, hogy oda-vissza akarunk váltani két funkció között, mint a többszálúaknál. A többszálú, amíg egy interrupt találkozik az operációs rendszer, akkor folyamatosan végrehajtó. Ebben az esetben bármikor válthatunk, amikor csak akarunk.

nézzünk egy példát:

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

ebben a példában láthatjuk, hogy oda-vissza válthatunk a korutinok között, amikor csak akarunk.

tehát, ha saját egyéni ütemezőnket írunk, amely kezeli a több coroutine közötti váltást, akkor az egyszálú szálakkal elérhetjük azt, amit a többszálú szálakkal csinálunk.

a Coroutines számos alkalmazással rendelkezik, mint például a konkurencia, és más programozási minták is megvalósíthatók, mint például a gyártó-fogyasztó vagy a küldő-Vevő a hálózati programozásban. Ezeket a következő cikkekben fogom feltárni.

a Korutinok számos keretrendszer építőkövei is, mint például az asyncio, twisted, aiohttp. Ezeket is össze lehet láncolni, hogy csővezetékeket készítsenek és megoldják a problémákat.