Heim >Backend-Entwicklung >Golang >Was ist der Unterschied zwischen Threads und Coroutinen in Golang?

Was ist der Unterschied zwischen Threads und Coroutinen in Golang?

青灯夜游
青灯夜游Original
2021-03-18 17:23:553261Durchsuche

Unterschied: Die Daten im Thread werden im Kernel-Modus-Speicherbereich gespeichert, während die Daten in der Coroutine im vom Thread bereitgestellten Benutzermodus-Speicherbereich gespeichert werden. Die Aufgabenplanung von Threads wird vom Kernel implementiert, und die Vorkaufsmethode basiert auf verschiedenen Sperren. Die Aufgabenplanung von Coroutinen wird von einem bestimmten Scheduler implementiert, der im Benutzermodus implementiert ist.

Was ist der Unterschied zwischen Threads und Coroutinen in Golang?

Die Betriebsumgebung dieses Tutorials: Windows 10-System, GO 1.11.2, Thinkpad T480-Computer.

Coroutine
Coroutine, der englische Name ist Coroutine. Aber in der Go-Sprache lautet der englische Name von Coroutine: Goroutine. Es wird häufig für Multitasking, also gleichzeitige Aufgaben, verwendet. Das ist richtig, es ist der Multithread-Job.

Obwohl wir in Go keinen direkten Code wie Threads schreiben müssen, um Parallelität durchzuführen, basieren die Coroutinen von Go auf Threads.

Werfen wir einen Blick auf ihre Unterschiede.

Für eine grundlegende Einführung in Threads suchen Sie bitte hier online nach Artikeln, da es viele hervorragende Einführungsartikel zu Threads gibt.

Eigenschaften von Coroutinen
Hier listen wir zunächst direkt die Eigenschaften von Threads auf und analysieren sie dann anhand von Beispielen.

  • Mehrere Coroutinen können von einem oder mehreren Threads verwaltet werden. Die Planung von Coroutinen erfolgt in dem Thread, in dem sie sich befinden.

  • kann geplant werden, und die Planungsstrategie wird durch den Code der Anwendungsschicht definiert, der stark angepasst werden kann.

  • Hohe Ausführungseffizienz.

  • beansprucht weniger Speicher.

Der obige 1. und 2.Punkt

我们来看一个例子:
func TestGorutine(t *testing.T) {
	runtime.GOMAXPROCS(1)  // 指定最大 P 为 1,从而管理协程最多的线程为 1 个
	wg := sync.WaitGroup{} // 控制等待所有协程都执行完再退出程序
	wg.Add(2)
	// 运行一个协程
	go func() {
		fmt.Println(1)
		fmt.Println(2)
		fmt.Println(3)
		wg.Done()
	}()

	// 运行第二个协程
	go func() {
		fmt.Println(65)
		fmt.Println(66)
		// 设置个睡眠,让该协程执行超时而被挂起,引起超时调度
		time.Sleep(time.Second)
		fmt.Println(67)
		wg.Done()
	}()
	wg.Wait()}

Der obige Codeausschnitt führt zwei Coroutinen aus. Nach der Ausführung ist die Reihenfolge der beobachteten Ausgabe gestaffelt. Es kann sein:

656612367

bedeutet, dass während der Ausführung von Coroutine A jederzeit unterbrochen werden kann, um Coroutine B auszuführen. Coroutine B kann auch während der Ausführung von Coroutine A unterbrochen werden und dann Coroutine A ausführen. Es scheint, dass die Ausführung von Coroutine A und B wie ein Thread-Wechsel ist, aber bitte beachten Sie, dass A und B hier beide im selben Thread ausgeführt werden
. Bei ihrer Planung handelt es sich nicht um einen Thread-Wechsel, sondern um eine „reine Coroutine-Planung für den Anwendungsstatus“. Warum müssen Sie in Bezug auf den obigen Code die folgenden zwei Codezeilen angeben?

runtime.GOMAXPROCS(1)time.Sleep(time.Second)
Dazu müssen Sie sich mit den Grundlagen der Coroutine-Planung von Go befassen. Bitte lesen Sie meinen anderen vorherigen Artikel zur Planungsanalyse: Gos Coroutine-Planungsmechanismus
Wenn runtime.GOMAXPROCS(1) nicht festgelegt ist, dann ist das Programm die entsprechende Anzahl von P wird entsprechend der Anzahl der CPU-Kerne des Betriebssystems gestartet, was zum Start mehrerer M, also Threads, führt. Dann werden die Coroutinen in unserem Programm verschiedenen Threads zugewiesen. Zu Demonstrationszwecken wird die Zahl auf 1 gesetzt, sodass sie alle demselben Thread zugewiesen und in der Coroutine-Warteschlange des Threads gespeichert werden, wo sie auf die Ausführung oder Planung warten.


Punkte

3

und

4 in Coroutine-Funktionen. 3. Hohe Ausführungseffizienz. 4. Beansprucht wenig Speicher. Da
die Planung des Wechsels von Coroutinen kein Thread-Wechsel ist, sondern vom Programm selbst gesteuert wird,
gibt es im Vergleich zum Multithreading keinen Overhead Die Leistungsvorteile von Coroutinen sind offensichtlich. Die Planung erfolgt im Anwendungsmodus und nicht im Kernelmodus.

Die Speicherkosten nutzen den Speicher des Threads, in dem er sich befindet, was bedeutet, dass der Speicher des Threads von mehreren Coroutinen verwendet werden kann. Zweitens erfordert die Planung von Coroutinen keinen Multi-Thread-Sperrmechanismus, da es nur einen Thread gibt und es keinen Konflikt beim gleichzeitigen Schreiben von Variablen gibt

, sodass die Ausführungseffizienz viel höher ist als die von Multithreads.

Gesamtvergleich von Coroutinen und Threads

VergleichspunkteThreads

CoroutinenDatenspeicherungSpeicher im Kernelmodus Nur Benutzermodus, der von Threads bereitgestellt wird. SpeicherplatzUmschaltvorgangDer Vorgang wird schließlich auf der Kernelschicht abgeschlossen. Die Anwendungsschicht muss die von der Kernelschicht bereitgestellte Systemaufruffunktion aufrufen. Die Anwendungsschicht kann den Code verwenden, um eine einfache Speicherung und Wiederherstellung vor Ort durchzuführen Die vom Kernel implementierte Preemption-Methode basiert auf verschiedenen Sperren. Die meisten ProgrammiersprachenImplementiert gemäß den Spezifikationen moderner BetriebssystemeEmpfohlenes Lernen: Golang-Tutorial
Aufgabenplanung
Sie wird von einem bestimmten Planer implementiert, der im Benutzermodus implementiert ist. Zum Beispiel der Go-Coroutine-Scheduler Sprachunterstützung
Einige Sprachen: Lua, Go, Python... Implementierungsspezifikationen
Nein Vereinheitlichungsspezifikation. Es wird von Entwicklern auf der Anwendungsebene implementiert und ist stark angepasst. Beispielsweise unterstützt es nur Single-Threaded-Threads. Verschiedene Planungsstrategien usw.

Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen Threads und Coroutinen in Golang?. 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
Vorheriger Artikel:Hat Golang Hinweise?Nächster Artikel:Hat Golang Hinweise?