2016-07-21 1 views
1

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?

+0

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

+3

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. –

Répondre

1

Ce que vous avez là n'est pas une coroutine dans le sens du module asyncio et/ou du PEP-492. Comme le PEP lui-même dit:

[Cette PEP] ne concerne que le genre de coroutine qui utilise yield comme un signal au programmateur, indiquant que le coroutine vous attendra jusqu'à ce qu'un événement (comme IO) est terminé.

  1. Il n'y a pas ordonnanceur (boucle d'événement) impliqué dans votre exemple, et
  2. le coroutine n'utilise yield que « comme un signal à l'agenda »; c'est vraiment l'utiliser pour lire des données.