Je pensais que j'avais croisé coroutines avec très bon presentation de David Beazley mais je ne peux pas le réconcilier entièrement avec la nouvelle syntaxe décrite dans PEP-492. Dans la présentation, il explique comment les coroutines peuvent être considérées comme un pipeline qui est poussé au lieu d'être tiré de comme dans les générateurs.Coroutines Asyncio
Par exemple:
# cofollow.py
#
# A simple example showing how to hook up a pipeline with
# coroutines. To run this, you will need a log file.
# Run the program logsim.py in the background to get a data
# source.
from coroutine import coroutine
# A data source. This is not a coroutine, but it sends
# data into one (target)
import time
def follow(thefile, target):
thefile.seek(0,2) # Go to the end of the file
while True:
line = thefile.readline()
if not line:
time.sleep(0.1) # Sleep briefly
continue
target.send(line)
# A sink. A coroutine that receives data
@coroutine
def printer():
while True:
line = (yield)
print line,
# Example use
if __name__ == '__main__':
f = open("access-log")
follow(f,printer())
Comment peut-on mettre en œuvre le printer()
coroutine en utilisant cette nouvelle syntaxe? Je n'ai pas encore vu un exemple où la coroutine est poussée à utiliser cette nouvelle syntaxe. C'est possible?
Cela n'a pas * vraiment * beaucoup de choses à faire avec 'asyncio'. S'il n'utilise pas de boucle d'événement, ce n'est pas vraiment asynchrone au sens de ce que fournit le module 'asyncio'. – deceze
Cet exemple concerne les coroutines traditionnelles, où les coroutines décident quelle autre coroutine doit être exécutée et quelle valeur doit leur être envoyée. Ceci est difficile à maintenir et n'est généralement pas nécessaire, de sorte que les coroutines asynchrones se comportent différemment. Tout ce qu'ils peuvent faire est d'abandonner leur droit de passage et de passer un futur futur qui représente la tâche dont la suite devrait être ce coroutine. Et il y a une boucle d'événement qui arrange tout cela, il court et envoie les bonnes valeurs aux coroutines quand les délais sont terminés. –