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