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 funkci send místo next.

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.