Coroutine - cooperative routines

todo

Alternativa ai thread. Implementa una concorrenza cooperativa che richiede meno risorse, e non viene eseguita su più core.

Le coroutine sono una estensione dei generatori. Essendo yield bidirezionale, le coroutine non sono altro che generatori dove yield è utilizzato in modo bidirezionale.

<in> = yield <out>

title: Attenzione!
`yield` prima restituisce il valore e poi ne riceve uno in entrata, quindi la prima volta si deve chiamare con `next(coroutine)` oppure con `coroutine.send(None)`.

Bisogna tenere a mente che l’ordine di esecuzione è:

  1. yield ritorna il valore <out>
  2. l’esecuzione si blocca e aspetta un input
  3. si riattiva quando riceve un input tramite send(), che è il valore di <in>
def coroutine():
    print("coroutine started")
    for i in range(1,6):
        x = (yield i**2)
        print(f"Message to coroutine {x}")
c = coroutine()                              # Creazione della coroutine
print("coroutine created")
print(f"Message from coroutine {next(c)}")   # Attivazione della coroutine: si può 
                                             # usare next(c) oppure c.send(None).
try:
    while True:
        x = input("Enter a value: ")
        print(f"Message from coroutine {c.send(x)}")
except StopIteration: pass

python_book5