Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erklärung von Coroutinen in Python

Detaillierte Erklärung von Coroutinen in Python

王林
王林Original
2023-06-10 11:37:464429Durchsuche

Python ist eine beliebte Programmiersprache, die aufgrund ihrer Einfachheit, leichten Erlernbarkeit und ihres breiten Anwendungsspektrums weit verbreitet ist. Unter diesen ist Coroutine ein sehr wichtiges Konzept in Python und eine der Grundlagen der asynchronen IO-Programmierung in Python. Dieser Artikel enthält eine detaillierte Erklärung von Coroutinen in Python.

1. Was ist eine Coroutine? Coroutine ist ein leichter Thread im Benutzermodus, der portabler ist als Betriebssystem-Threads. Es wird vom Programmierer im Programm implementiert, sodass kein Kontextwechsel erforderlich ist. Der Coroutine-Wechsel wird vom Programm selbst ohne externen Eingriff durchgeführt. Dadurch kann auch die Erstellung von Threads reduziert und die CPU-Ressourcen effizienter genutzt werden.

Merkmale von Coroutinen:

können gleichzeitig im selben Thread ausgeführt werden, und der Umschaltaufwand ist sehr gering, sodass eine hohe Parallelität unterstützt wird.
  1. Der Status der Coroutine wird vom Programmierer selbst verwaltet, was einfacher ist als Threads.
  2. 2. Implementierung von Coroutinen

Es gibt drei Möglichkeiten, Coroutinen in Python zu implementieren: Generator, Async/Await und kombiniert mit Gevent. Im Folgenden stellen wir sie einzeln vor.

Generator
  1. Der Generator in Python selbst verfügt über die Funktion zum Speichern und Wiederherstellen des Zustands, was sich sehr gut für die Implementierung von Coroutinen eignet. Das größte Merkmal der Generator-Coroutine besteht darin, die Funktion mithilfe der Yield-Anweisung anzuhalten und den Funktionsstatus zu speichern.

Hier ist ein Beispiel für eine Coroutine:

def simple_coroutine():
    print('-> coroutine started')
    x = yield
    print('-> coroutine received:', x)

# 调用协程
my_coroutine = simple_coroutine()
print(my_coroutine)  # <generator object simple_coroutine at 0x7f6b25c43eb0>

# 先启动协程,让协程处于暂停状态。
next(my_coroutine)  # -> coroutine started

# 发送消息给协程,它会恢复执行,并打印出消息
my_coroutine.send('hello world')  # -> coroutine received: hello world

In diesem Beispiel enthält die Funktion simple_coroutine einen Yield-Ausdruck, der das Vorzeichen einer Generator-Coroutine ist. Wenn die Funktion aufgerufen wird, gibt sie ein Generatorobjekt zurück. Das Programm bringt den Generator durch Aufrufen der Methode next() zur ersten yield-Anweisung und gibt die Meldung „-> Coroutine gestartet“ aus. Dann schickten wir eine Nachricht „Hallo Welt“ an den Generator, die in der Variablen x erfasst und ausgedruckt wurde „-> Coroutine empfangen: Hallo Welt“.

async/await
  1. Nach Python 3.5 bietet Python native Unterstützung für die Coroutine-Syntax async/await. Es sorgt für eine sauberere Syntax und bessere Lesbarkeit.

Hier ist ein Beispiel für async/await:

import asyncio

async def countdown(n):
    while n > 0:
        print(f'T-minus {n}')
        await asyncio.sleep(1.0)
        n -= 1

asyncio.run(countdown(3))

In diesem Beispiel können wir mit async/await das Schlüsselwort async in der Funktion verwenden, um die Coroutine zu definieren, und mit „await“ die Coroutine anhalten. Um die Async/Await-Syntax verwenden zu können, müssen wir natürlich die Asyncio-Bibliothek verwenden.

Verwendung mit gevent
  1. gevent ist eine auf Coroutinen basierende Python-Netzwerkbibliothek. Sie bietet ein ertragsbasiertes Programmiermodell, das es Programmierern ermöglicht, asynchronen, nicht blockierenden Code zu schreiben, der einfach zu schreiben und zu testen ist. Um gevent nutzen zu können, müssen wir es zuerst über pip installieren.

Hier ist ein Beispiel für die Verwendung von gevent:

import gevent

def task(pid):
    """
    函数中的sleep模拟阻塞一段时间,通过gevent中的异步框架进行并发。
    """
    gevent.sleep(0.5)
    print(f'Task {pid} done')

def synchronous():
    """
    任务同步执行
    """
    for i in range(1, 10):
        task(i)

def asynchronous():
    """
    任务异步执行
    """
    threads = [gevent.spawn(task, i) for i in range(10)]
    gevent.joinall(threads)

print('Synchronous:')
synchronous()

print('Asynchronous:')
asynchronous()

In diesem Beispiel verwenden wir das Gevent-Framework, um asynchrone Coroutinen zu implementieren. Anhand dieses Beispiels können wir deutlich erkennen, dass während der asynchronen Ausführung Aufgaben abwechselnd ausgeführt werden und dabei die asynchronen Eigenschaften von Coroutinen ausgenutzt werden. Bei der synchronen Ausführung können wir sehen, dass Aufgaben einzeln ausgeführt werden.

3. Vor- und Nachteile von Coroutinen

Vorteile:

Coroutinen sind standardmäßig Single-Threaded, wodurch der durch Multi-Thread-Switching verursachte Overhead vermieden und die Programmausführungsgeschwindigkeit verbessert wird.
  1. Coroutinen können Multiprozess-GIL-Probleme (Global Interpreter Lock) vermeiden und die Programmeffizienz verbessern.
  2. Coroutinen können unbegrenzt erstellt werden, aber die Anzahl der Threads und Prozesse ist begrenzt, aber das Öffnen zu vieler Coroutinen führt auch zu Leistungsproblemen.
  3. Nachteile:

Coroutinen sind etwas Besonderes und erfordern, dass Programmierer den Laufstatus des Programms manuell steuern. Ihre Komplexität ist relativ hoch und erfordert mehr Aufwand.
  1. Der Coroutine-Code selbst verfügt nicht über einen Fehlerbehandlungsmechanismus, was die Behandlung von Ausnahmen und das Debuggen des Codes erschwert.
  2. 4. Zusammenfassung

In diesem Artikel werden das Konzept, die Implementierungsmethoden sowie die Vor- und Nachteile von Coroutinen in Python ausführlich vorgestellt. Coroutinen sind ein sehr wichtiges Konzept in Python und eine der Grundlagen der asynchronen IO-Programmierung. Durch Coroutinen können wir Unternehmen gleichzeitig im selben Thread ausführen, die Effizienz der Programmausführung verbessern, viel Aufwand für den Kontextwechsel vermeiden und Systemressourcen erheblich einsparen. Coroutinen weisen jedoch auch einige Mängel auf, z. B. dass Programmierer über hohe Programmierkenntnisse und unvollständige Fehlerbehandlungsmechanismen verfügen müssen. Auf diese Probleme müssen Programmierer bei der Verwendung von Coroutinen achten.

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

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn