Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erklärung von Coroutinen in Python (mit Beispielen)

Detaillierte Erklärung von Coroutinen in Python (mit Beispielen)

不言
不言nach vorne
2018-10-13 16:31:012921Durchsuche

Dieser Artikel bietet Ihnen eine detaillierte Erklärung von Coroutinen in Python (mit Beispielen). Ich hoffe, dass er für Freunde in Not hilfreich ist.

Coroutinen, auch bekannt als Mikrofäden und Fasern. Der englische Name Coroutine
sieht aus wie eine Unterroutine, kann jedoch während der Ausführung innerhalb der Unterroutine unterbrochen werden, dann zur Ausführung anderer Unterroutinen wechseln und dann zu gegebener Zeit zurückkehren, um die Ausführung fortzusetzen.

Der größte Vorteil ist die extrem hohe Ausführungseffizienz von Coroutinen. Da das Wechseln von Unterprogrammen kein Thread-Wechsel ist, sondern vom Programm selbst gesteuert wird, entsteht beim Thread-Wechsel kein Overhead. Im Vergleich zum Multithreading sind die Leistungsvorteile von Coroutinen umso offensichtlicher, je größer die Anzahl der Threads ist.
Der zweitgrößte Vorteil besteht darin, dass kein Multi-Thread-Sperrmechanismus erforderlich ist, da nur ein Thread vorhanden ist und es keinen Konflikt beim gleichzeitigen Schreiben von Variablen gibt. Gemeinsam genutzte Ressourcen werden in der Coroutine ohne Sperre gesteuert , und nur der Status muss bestimmt werden, also ausführen Die Effizienz ist viel höher als bei Multithreading.
Wie verwende ich eine Multi-Core-CPU, da die Coroutine von einem Thread ausgeführt wird? Die einfachste Methode ist Multiprozess + Coroutine, die nicht nur mehrere Kerne voll ausnutzt, sondern auch die hohe Effizienz von Coroutine voll ausnutzt und eine extrem hohe Leistung erzielen kann.

Yield implementiert Coroutinen

Pythons Unterstützung für Coroutinen ist immer noch sehr begrenzt. In Generatoren kann Yield Coroutinen bis zu einem gewissen Grad implementieren. Obwohl die Unterstützung noch nicht vollständig ist, kann sie bereits erhebliche Macht entfalten.

import threading
import time
def producer(c):
    c.__next__()
    n=0
    while n c.send(n) --> n更新
        n = yield r
        if not n:
            break
        print('[消费者]正在调用第%s条数据' %(n))
        time.sleep(1)
        r = 'This is ok!'

if __name__=='__main__':
    print(threading.current_thread())   
    print(threading.active_count())     #查看当前进行的线程
    c = consumer()
    producer(c)     #函数中有yield, 返回值为生成器;
    print(threading.active_count()) #1

Detaillierte Erklärung von Coroutinen in Python (mit Beispielen)

gevent-Bibliothek implementiert Coroutinen

Python bietet grundlegende Unterstützung für Coroutinen durch yield , jedoch nicht vollständig . Das Gevent eines Drittanbieters bietet relativ vollständige Coroutine-Unterstützung für Python.

gevent ist eine Bibliothek eines Drittanbieters, die Coroutinen über Greenlets implementiert. Die Grundidee ist:
Wenn ein Greenlet auf eine E/A-Operation stößt, beispielsweise auf den Zugriff auf das Netzwerk, wechselt es automatisch zu anderen Greenlets und wartet, bis die E/A-Operation ausgeführt wird abgeschlossen ist, und wechseln Sie dann ggf. zurück, um die Ausführung fortzusetzen. Da E/A-Vorgänge sehr zeitaufwändig sind, bleibt das Programm oft im Wartezustand. Da gevent die Coroutinen für uns automatisch umschaltet, ist gewährleistet, dass Greenlets immer ausgeführt werden, anstatt auf E/A zu warten.

Da die Umschaltung während der E/A-Vorgänge automatisch abgeschlossen wird, muss gevent einige der mit Python gelieferten Standardbibliotheken ändern. Dieser Vorgang wird beim Start durch einen Monkey-Patch abgeschlossen.

Angenommen, die von mehreren Coroutinen ausgeführten Aufgaben haben keine E/A-Operationen oder Wartezeiten, dann werden die Coroutinen nacheinander und nicht abwechselnd ausgeführt.
Angenommen, die von mehreren Coroutinen ausgeführten Aufgaben haben E/A-Operationen oder Wartezeiten, dann Coroutinen abwechselnd ausführen; Ein Vergleichsexperiment zur Zeit, die Coroutinen und Threads mit Threads verbringen

ist nicht aufschlussreich. Detaillierte Erklärung von Coroutinen in Python (mit Beispielen)

#没有等待
import gevent
from gevent import monkey
monkey.patch_all()
def job(n):
    for i in range(n):
        print(gevent.getcurrent(),i)

def mian():
    g1 = gevent.spawn(job,1)
    g2 = gevent.spawn(job,2)
    g3 = gevent.spawn(job,3)
    gevent.joinall([g1,g2,g3])
    print('协程执行任务结束...')

if __name__=="__main__":
    mian()

Detaillierte Erklärung von Coroutinen in Python (mit Beispielen)

Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung von Coroutinen in Python (mit Beispielen). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen

In Verbindung stehende Artikel

Mehr sehen