2016-07-21 27 views
1

Ich dachte, ich hätte mit David Beazleys sehr gutem presentation groked Coroutinen, aber ich kann es nicht vollständig mit der neuen in PEP-492 beschriebenen Syntax versöhnen.Asyncio coroutines

In der Präsentation erklärt er, wie Coroutines als eine Pipeline, die geschoben wird, im Gegensatz zu gezogen wie in Generatoren gedacht werden.

Zum Beispiel:

# 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()) 

Wie kann man implementieren die printer() Koroutine diese neue Syntax? Ich habe noch kein Beispiel gesehen, bei dem die Coroutine dazu gebracht wird, diese neue Syntax zu verwenden. Ist es möglich?

+0

Das hat nicht wirklich viel mit 'asyncio' zu tun. Wenn es keine Ereignisschleife verwendet, ist es nicht wirklich asynchron im Sinne dessen, was das 'asyncio'-Modul bietet. – deceze

+3

In diesem Beispiel geht es um traditionelle Koroutinen, bei denen Koroutinen entscheiden, welche andere Coroutine ausgeführt werden soll und welcher Wert an sie gesendet werden soll. Dies ist schwierig zu verwalten und normalerweise nicht notwendig, so dass async-Coroutinen sich unterschiedlich verhalten. Alles, was sie tun können, ist, ihr Recht aufzugeben und ein zukünftiges Objekt zu übergeben, das die Aufgabe darstellt, deren Fortsetzung diese Coroutine sein soll. Und es gibt eine Event-Schleife, die all dies arrangiert, es läuft und die richtigen Werte an Coroutines sendet, wenn die Wartezeit abgeschlossen ist. –

Antwort

1

Was Sie dort haben, ist keine Coroutine im Sinne des asyncio Moduls und/oder PEP-492. Da der PEP selbst sagt:

[Dieser PEP] nur auf die Art der Koroutine relevant ist, die yield als Signal an den Scheduler verwendet, was darauf hinweist, dass die Koroutine werden, bis ein Ereignis (wie IO) warten ist abgeschlossen.

  1. Es gibt keinen Scheduler (Ereignisschleife) in Ihrem Beispiel beteiligt, und
  2. die Koroutine nicht mit yield nur "als ein Signal an den Scheduler"; es benutzt es wirklich, um Daten zu lesen.