Coroutiny jsou v podstatě funkce, jejichž provádění může být pozastaveno / pozastaveno v určitém bodě,a pak můžeme pokračovat v provádění ze stejného bodu později, kdykoli chceme.
potřebujeme mechanismus – nebo přesněji Klíčové slovo-pomocí kterého můžeme vložit kontrolní bod a říct programu, že zde chceme pozastavit provádění funkce a vrátit kontrolu do bodu, ze kterého volala. Budeme pokračovat v popravě, kdykoli budeme chtít.
v Pythonu můžeme pozastavit provádění funkce pomocí klíčového slova yield
.
takže tady jsou věci zajímavé:
- coroutine můžeme považovat za funkci, která má jeden nebo více kontrolních bodů, kde bude provedení pozastaveno a kontrola bude vrácena do bodu, odkud byla volána.
- coroutine je v podstatě funkce rozdělená do mnoha částí a každou část coroutine můžeme spustit, když provádíme každou iteraci smyčky for pomocí funkce
next
.
zde je základní příklad:
OUTPUT :<class 'generator'>
Function Starts
Function Ends
z výstupu si všimneme několika věcí:
- nejprve musíme zavolat funkci coroutine/, která nám dá objekt generátoru.
- tento objekt generátoru se bude chovat podobně jako iterátor, ale v případě iterátoru přejíždíme přes iterovatelný. S generátorem provádíme části coroutinu.
- stejně jako je výjimka
StopIteration
hozena a zachycena v zákulisí smyčky for, totéž se děje v tomto případě, když je provedena poslední část coroutinu.
nyní je toto pozastavení funkce mezi nimi velmi zajímavé a otevírá některé možnosti:
- když je funkce pozastavena, neděláme nic, což je případ, který jsme právě viděli.
- Předpokládejme, že proměnná je ve funkci několikrát upravována a chceme hodnotu této konkrétní proměnné v určitém kontrolním bodě. Poté, když pozastavíme tuto funkci na daném kontrolním bodě, vrátí hodnotu této proměnné.
podívejme se na příklad:
OUTPUT :Function Part 1
5
Function part 2
12
Function part 3
zde je hodnota x
vrácena yield
na různých kontrolních bodech, protože provádění funkce bylo pozastaveno.
kdykoli provádíme poslední část funkce a ve funkci nezůstane žádný výnos, po provedení této poslední části bude zvýšena výjimka StopIteration
.
podobně jako když se iterátor pokusí provést další funkci, ale v iterable nezůstanou žádné další prvky, vyvolává také výjimku StopIteration
.
- Předpokládejme, že chceme poslat hodnotu (která může být konstanta nebo proměnná) na určitý kontrolní bod (tj. v určitém stavu funkce). Můžeme to také udělat pomocí klíčového slova
yield
. Když chceme odeslat hodnotu, použijeme funkcisend
místonext
.
podívejme se na příklad:
OUTPUT :Function part 1
6
Function part 2
12
Function part 3
důvod, proč jsme použili next
před použitím send
, je, že send
můžeme použít pouze tehdy, když jsme na kontrolním bodě yield
a yield
je na pravé straně výrazu. Abychom dosáhli toho prvního yield
, musíme použít funkci next
.
nyní přichází zajímavá aplikace coroutinů. Předpokládejme, že chceme přepínat tam a zpět mezi dvěma funkcemi, jako to děláme v multithreading. V multithreadingu, dokud se os nesetká s interrupt
, bude pokračovat v provádění. V tomto případě můžeme přepnout, kdykoli chceme.
podívejme se na příklad:
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
v tomto příkladu vidíme, že mezi coroutiny můžeme přepínat tam a zpět, kdykoli chceme.
takže pokud budeme psát vlastní plánovač, který zpracovává přepínání mezi více coroutines, můžeme dosáhnout s jedním závitem, co děláme s multithreading.
Coroutines mají mnoho aplikací, jako je souběžnost a jiné programovací vzory mohou být také implementovány, jako výrobce-spotřebitel nebo odesílatel-přijímač v programování sítě. Budu zkoumat ty v nadcházejících článcích.
Coroutiny jsou také stavebními kameny mnoha rámců, jako jsou asyncio, twisted, aiohttp. Mohou být také spojeny dohromady, aby vytvořily potrubí a vyřešily problémy.
Napsat komentář