Heim  >  Artikel  >  Backend-Entwicklung  >  So wenden Sie Coroutinen in der gleichzeitigen Python-Programmierung an

So wenden Sie Coroutinen in der gleichzeitigen Python-Programmierung an

王林
王林nach vorne
2023-05-13 08:16:051300Durchsuche

Was ist Coroutine

Coroutine ist eine einfachere Parallelitätsmethode als Threads. Sie erfordert keinen Aufwand für den Thread-Kontextwechsel und kann Parallelität in einem einzelnen Thread erreichen. Coroutinen haben normalerweise die folgenden Eigenschaften:

  • Der Code in der Coroutine kann die Ausführung anhalten und bei Bedarf wieder aufnehmen.

  • Mehrere Coroutinen können gleichzeitig im selben Thread ausgeführt werden, es wird jedoch immer nur eine Coroutine ausgeführt.

  • Coroutinen werden normalerweise basierend auf der Ereignisschleife (Ereignisschleife) implementiert, und die Ereignisschleife ist für die Planung der Ausführung der Coroutine verantwortlich.

Coroutinen und Threads

Threads und Coroutinen sind beide Möglichkeiten, gleichzeitige Programmierung zu implementieren, weisen jedoch einige unterschiedliche Eigenschaften und Anwendungsszenarien auf.

**Thread ist die Grundeinheit der Betriebssystemplanung **Jeder Thread hat seinen eigenen Ausführungskontext, einschließlich Thread-Stack, Register usw. Das Wechseln zwischen Threads erfordert einen Kontextwechsel, einschließlich Vorgängen wie dem Speichern des Kontexts des aktuellen Threads und dem Wiederherstellen des Kontexts eines anderen Threads. Diese Vorgänge nehmen viel Zeit und Ressourcen in Anspruch. Bei der Multithread-Programmierung ist der Thread-Wechsel aus folgenden Gründen ein sehr häufiger Vorgang:

  1. Planung. Wenn mehrere Threads gleichzeitig ausgeführt werden, muss das Betriebssystem diese Threads planen und anhand von Faktoren wie der Priorität bestimmen, welcher Thread aktuell ausgeführt werden soll. Der Thread-Wechsel ist eine der Grundoperationen der Planung. Durch den Thread-Wechsel kann das Betriebssystem die gleichzeitige Ausführung mehrerer Threads erreichen.

  2. Warten. Wenn ein Thread auf das Eintreten eines Ereignisses warten muss, z. B. auf den Abschluss eines E/A-Vorgangs, auf die Aufhebung einer Sperre usw., kann der Thread die CPU aktiv freigeben, um anderen Threads die Möglichkeit zur Ausführung zu geben. Nachdem die Wartezeit abgeschlossen ist, kann der Thread erneut aktiviert werden und die Ausführung wird fortgesetzt.

  3. Parallelität. Threads können den Effekt einer gleichzeitigen Ausführung erzielen. Beispielsweise verarbeitet ein Thread Netzwerkanforderungen und ein anderer Thread verarbeitet die Benutzerinteraktion. Dadurch können die Reaktionsgeschwindigkeit und die Verarbeitungsfähigkeiten des Systems verbessert werden.

  4. Wechseln Sie zur Ausführung zu anderen Threads. In einigen Fällen kann der Thread aus bestimmten Gründen möglicherweise nicht mit der Ausführung fortfahren, z. B. wenn der Thread in eine Endlosschleife eintritt oder eine Ausnahme auftritt. Zu diesem Zeitpunkt ist es erforderlich, zur Ausführung zu anderen Threads zu wechseln, um Systemabstürze zu vermeiden andere Probleme.

Die gleichzeitige Programmierung von Threads wird normalerweise durch Probleme wie Multi-Thread-Konkurrenz, Deadlock und Kontextwechsel eingeschränkt. Wenn Sie in Python Multithread-Programmierung verwenden, müssen Sie auf Themen wie Thread-Sicherheit und GIL achten.

Coroutine ist eine leichte Parallelitätsmethode, die im Benutzerbereich implementiert wird und nicht auf die Planung des Betriebssystems angewiesen ist. Coroutinen können Parallelität im selben Thread ohne Kontextwechsel erreichen, sodass die Ausführungseffizienz sehr hoch ist. Coroutinen verwenden normalerweise eine Ereignisschleife (Event Loop), um die Ausführung von Coroutinen zu planen. Wenn die Coroutine auf E/A-Operationen oder andere Coroutinen warten muss, unterbricht die Ereignisschleife die Ausführung der aktuellen Coroutine und führt andere Coroutinen aus, wodurch eine gleichzeitige Ausführung erreicht wird. Wirkung. In Python werden Coroutinen normalerweise mit dem Modul asyncio implementiert, das asynchrone E/A, Netzwerkprogrammierung, Aufgabenplanung und andere Szenarien unterstützt. asyncio 模块来实现,支持异步 IO、网络编程、任务调度等场景。

相对于线程,协程的主要优点包括:

  • 更加轻量级,占用的资源更少;

  • 不需要进行上下文切换,执行效率更高;

  • 可以使用事件循环进行调度,实现高并发的效果;

  • 不会受到 GIL 的限制,可以更好地利用多核 CPU。

然而,协程也有一些限制,例如无法利用多核 CPU、调试困难等问题。在选择使用线程还是协程时,需要根据具体的应用场景进行选择。

协程的应用

协程可以应用于很多场景,例如:

  • 网络编程:协程可以帮助我们实现高并发的网络应用。

  • 异步IO:协程可以帮助我们高效地处理异步IO操作。

  • 数据库操作:协程可以帮助我们实现高并发的数据库应用。

  • 任务调度:协程可以帮助我们实现高效的任务调度系统。

演示Demo

下面是一个示例代码,演示了如何使用协程和 asyncio 模块来实现一个简单的任务调度:

import asyncio

async def task1():
    print("Task 1")
    await asyncio.sleep(1)
    print("Task 1 done")

async def task2():
    print("Task 2")
    await asyncio.sleep(2)
    print("Task 2 done")


async def task3():
    print("Task 3")
    await asyncio.sleep(3)
    print("Task 3 done")


async def main():
    await asyncio.gather(task1(), task2(), task3())

这段代码使用了 Python 的协程和 asyncio 模块,定义了三个协程函数 task1task2task3,以及一个主协程函数 main。每个协程函数打印自己的任务名,然后暂停一段时间。主协程函数使用 asyncio.gather

Zu den Hauptvorteilen von Coroutinen gehören: #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Leichtgewichtiger und weniger Ressourcen beanspruchend; #🎜🎜##🎜🎜# Es ist kein Kontextwechsel erforderlich und die Ausführungseffizienz ist höher. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Sie können die Ereignisschleife zur Planung verwenden, um eine hohe Parallelität zu erzielen ; #🎜🎜##🎜🎜##🎜🎜##🎜🎜# wird nicht durch GIL eingeschränkt und kann Multi-Core-CPUs besser nutzen. #🎜🎜##🎜🎜##🎜🎜##🎜🎜# Coroutinen weisen jedoch auch einige Einschränkungen auf, z. B. die Unfähigkeit, Mehrkern-CPUs zu verwenden, Schwierigkeiten beim Debuggen und andere Probleme. Wenn Sie sich für die Verwendung von Threads oder Coroutinen entscheiden, müssen Sie eine Entscheidung basierend auf dem spezifischen Anwendungsszenario treffen. #🎜🎜##🎜🎜#Anwendung von Coroutine#🎜🎜##🎜🎜#Coroutine kann auf viele Szenarien angewendet werden, wie zum Beispiel: #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Netzwerkprogrammierung: Coroutine Die Programmierung kann uns bei der Implementierung von Netzwerkanwendungen mit hoher Parallelität helfen. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Asynchrone E/A: Coroutinen können uns dabei helfen, asynchrone E/A-Vorgänge effizient abzuwickeln. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Datenbankoperationen: Coroutinen können uns bei der Implementierung von Datenbankanwendungen mit hoher Parallelität helfen. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Aufgabenplanung: Coroutinen können uns bei der Implementierung eines effizienten Aufgabenplanungssystems helfen. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#DemoDemo#🎜🎜##🎜🎜#Das Folgende ist ein Beispielcode, der zeigt, wie Coroutinen und das asyncio-Modul zur Implementierung verwendet werden Eine einfache Aufgabenplanung: #🎜🎜#
Task 1
Task 2
Task 3
Task 1 done
Task 2 done
Task 3 done
[Finished in 3.2s]
#🎜🎜#Dieser Code verwendet Pythons Coroutine und das asyncio-Modul und definiert drei Coroutine-Funktionen task1 , task2, <code>task3 und eine Haupt-Coroutine-Funktion main. Jede Coroutine-Funktion gibt ihren eigenen Aufgabennamen aus und pausiert dann für einen bestimmten Zeitraum. Die Haupt-Coroutine-Funktion verwendet asyncio.gather, um drei Coroutine-Funktionen gleichzeitig auszuführen. Das endgültige Ausgabeergebnis ist: #🎜🎜#rrreee

Das obige ist der detaillierte Inhalt vonSo wenden Sie Coroutinen in der gleichzeitigen Python-Programmierung an. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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