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 asend
függvényt használjuk anext
helyett.
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.
Vélemény, hozzászólás?