Pourrais-je connecter deux coroutines A et B pour que A excite B et B excite A ? Par exemple, A accepterait un nombre, l'imprimerait et invoquerait B avec (nombre+1). B l'imprimerait et invoquerait A avec (nombre+1). Je m'attendrais à ce que 1,2,3,4,5,... soit imprimé.
Ce code fonctionne malheureusement comme prévu
def coroutine(func):
def start(*args,**kwargs):
cr = func(*args,**kwargs)
cr.next()
return cr
return start
_target_from_a = None
_target_from_b = None
@coroutine
def func_a():
while True:
item = yield
print 'a', item
_target_from_a.send(item + 1)
@coroutine
def func_b():
while True:
item = yield
print 'b', item
_target_from_b.send(item + 1)
a = func_a()
b = func_b()
_target_from_a = b
_target_from_b = a
a.send(1)
il produit le résultat suivant erreur :
a 1
b 2
Traceback (most recent call last):
File "coloop.py", line 31, in <module>
a.send(1)
File "coloop.py", line 17, in func_a
_target_from_a.send(item + 1)
File "coloop.py", line 24, in func_b
_target_from_b.send(item + 1)
ValueError: generator already executing