Coroutine - cooperative routines
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 è:
yieldritorna il valore<out>- l’esecuzione si blocca e aspetta un input
- 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