In der Praxis: Nutzung der „yield from“-Syntax in Python 3.3
Die in Python 3.3 eingeführte „yield from“-Syntax bietet Folgendes eine erhebliche Verbesserung der Fähigkeiten von Generatoren und Coroutinen. Es stellt eine bidirektionale Verbindung zwischen einem Anrufer und einem Subgenerator her und ermöglicht so eine nahtlose Kommunikation in beide Richtungen.
Anwendungsfälle für „Ertrag aus“
Lesen Daten von Generatoren:
def reader():
for i in range(4):
yield '<< %s' % i
def reader_wrapper(g):
yield from g
wrap = reader_wrapper(reader())
for i in wrap:
print(i)
# Result:
# << 0
# << 1
# << 2
# << 3
Senden von Daten an Coroutinen:
def writer():
while True:
w = (yield)
print('>> ', w)
def writer_wrapper(coro):
yield from coro
w = writer()
wrap = writer_wrapper(w)
wrap.send(None) # Prime the coroutine
for i in range(4):
wrap.send(i)
# Expected result:
# >> 0
# >> 1
# >> 2
# >> 3
Vergleich mit Micro-Threads
Die Syntaxausbeute weist einige Ähnlichkeiten mit Micro-Threads auf, da sie das Anhalten und Fortsetzen von Coroutinen ermöglicht und so eine leichte Alternative zu schafft traditionelle Threads. Allerdings sind Coroutinen im Vergleich zu Mikrothreads leichter und haben einen geringeren Speicheraufwand. Sie werden auch im selben Thread ausgeführt, wodurch die Probleme vermieden werden, die mit dem Kontextwechsel in Umgebungen mit mehreren Threads verbunden sind.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3