Heim > Artikel > Backend-Entwicklung > Was ist der Unterschied zwischen Threads und Coroutinen in Golang?
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.
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
3
und4 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
Datenspeicherung | Speicher im Kernelmodus Nur Benutzermodus, der von Threads bereitgestellt wird. Speicherplatz | |
---|---|---|
Der 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 | 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. | Empfohlenes Lernen: | |
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!