Heim  >  Artikel  >  Was ist der Unterschied zwischen Golang-Threads und Coroutinen?

Was ist der Unterschied zwischen Golang-Threads und Coroutinen?

DDD
DDDOriginal
2023-06-16 13:14:071130Durchsuche

Der Unterschied zwischen Golang-Threads und Coroutinen: 1. Verschiedene Planungsmethoden, Threads werden präventiv gemäß CPU-Zeitscheiben geplant, und Coroutinen werden vom Go-Sprachlaufzeitplaner geplant. 2. Planungsstrategien sind unterschiedlich, Threads werden präventiv geplant, Coroutine 3. Die Kontextwechselgeschwindigkeit ist unterschiedlich, die Threadwechselgeschwindigkeit beträgt etwa 1 bis 2 Mikrosekunden und die Coroutinenwechselgeschwindigkeit beträgt etwa 0,2 Mikrosekunden. 4. Die Stapelgröße ist unterschiedlich, die Thread-Stapelgröße beträgt im Allgemeinen 8 MB Die Go-Coroutine-Stapelgröße beträgt standardmäßig 2 KB.

Was ist der Unterschied zwischen Golang-Threads und Coroutinen?

Die Betriebsumgebung dieses Artikels: Windows 10-System, go1.20-Version, Dell G3-Computer.

Der Unterschied zwischen Golang-Threads und Coroutinen:

1. Planungsmethode

Threads: Threads werden präventiv basierend auf CPU-Zeitscheiben geplant. Das Betriebssystem führt die Thread-Kontextumschaltung über Interrupt-Signale (Timer-Interrupts, E/A-Geräte-Interrupts usw.) durch. Wenn ein Thread-Kontextwechsel auftritt, muss dieser vom Betriebssystem-Benutzermodus in den Kernel-Modus übertragen werden und die Statusinformationen werden gespeichert. Beim Wechsel zum nächsten auszuführenden Thread müssen die Statusinformationen geladen und von diesem übertragen werden vom Kernelmodus in den Benutzermodus des Betriebssystems.

Coroutine: Coroutine existiert im Benutzermodus und wird vom Go-Language-Laufzeitplaner geplant. Coroutinen gehören zu einem bestimmten Thread. Eine Coroutine kann zur Ausführung auch auf mehrere Threads umgeschaltet werden.

2. Planungsstrategie

Threads: Präventive Planung. Um den Ausführungszyklus jedes Threads auszugleichen, sendet der Betriebssystem-Scheduler regelmäßig Interrupt-Signale, um den Thread-Kontextwechsel zu erzwingen.

Coroutine: Kollaborative Planung. Nachdem eine Coroutine die Verarbeitung ihrer eigenen Aufgaben abgeschlossen hat, kann sie die Ausführungsrechte aktiv auf andere Coroutinen übertragen und wird nicht so einfach vorenthalten. Erst wenn die Coroutine zu lange ausgeführt wurde, wird der Go-Sprachplaner ihre Ausführung zwangsweise verhindern.

3. Kontextwechselgeschwindigkeit

Threads: Der Thread-Kontextwechsel erfordert den Wechsel zwischen dem Betriebssystembenutzermodus und dem Kernelmodus, und die Wechselgeschwindigkeit beträgt etwa 1 bis 2 Mikrosekunden.

Coroutine: Coroutine ist ein leichter Thread im Benutzermodus. Das Umschalten von Coroutine erfordert kein Umschalten zwischen Benutzermodus und Kernelmodus, und während des Umschaltens müssen nur wenige Statuswerte gespeichert werden, sodass die Umschaltgeschwindigkeit um ein Vielfaches höher ist schneller. Es sind etwa 0,2 Mikrosekunden. (Etwa zehnmal schneller als Threadwechsel)

4. Stapelgröße

Thread: Die Stapelgröße eines Threads wird im Allgemeinen beim Erstellen angegeben. Die Standardstapelgröße beträgt unter Linux und Mac im Allgemeinen 8 MB (kann ulimit übergeben werden). s Ansicht). 2000 Threads erfordern 16 GB virtuellen Speicher.

Coroutine: Die standardmäßige Go-Coroutine-Stapelgröße beträgt 2 KB, und 16 GB virtueller Speicher können mehr als 8 Millionen Coroutinen erstellen. In der Praxis kommt es häufig vor, dass Tausende von Coroutinen existieren.

Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen Golang-Threads und Coroutinen?. 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