Golang-Programmierkenntnisse für hohe Parallelität: Tiefgreifendes Verständnis der Planungsstrategie von Goroutinen
Einführung: Golang ist eine Sprache für hohe Parallelität, und ihre integrierten, leichtgewichtigen Thread-Goroutinen sind eines ihrer Kernmerkmale der gleichzeitigen Programmierung. Dieser Artikel befasst sich mit der Planungsstrategie von Goroutinen und der Frage, wie die Leistung gleichzeitiger Programme durch sinnvollen Einsatz von Planungsstrategien optimiert werden kann.
1. Planungsstrategie von Goroutinen
Goroutinen sind leichtgewichtige Threads von Golang. Im Vergleich zu herkömmlichen Betriebssystem-Threads ist die Planung von Goroutinen flexibler und effizienter. Golang verwendet eine Komponente namens Scheduler, um zu entscheiden, welche Goroutine wann ausgeführt werden soll. In Golang müssen wir die Planung von Goroutinen im Allgemeinen nicht manuell steuern, sondern der Scheduler erledigt dies automatisch.
Die Planungsstrategie von Goroutinen umfasst hauptsächlich drei Aspekte: präventive Planung, kollaborative Planung und Arbeitsdiebstahl.
Der Planer von Golang verwendet eine präventive Planungsstrategie, das heißt, die Ausführung einer Goroutine kann jederzeit von anderen Goroutinen unterbrochen werden. Der Vorteil dieser Planungsstrategie besteht darin, dass sie CPU-Ressourcen sinnvoll zuweisen und verhindern kann, dass eine bestimmte Goroutine die CPU für längere Zeit monopolisiert, was dazu führt, dass andere Goroutinen nicht ausgeführt werden können. Wenn eine Goroutine vorbelegt wird, speichert der Scheduler ihren Status und wechselt zu anderen ausführbaren Goroutinen.
Zusätzlich zur präventiven Planung wendet Golangs Planer auch eine kollaborative Planungsstrategie an. Bei der kooperativen Planung gibt Goroutine automatisch die Ausführungsrechte der CPU auf, anstatt die CPU ständig zu belegen. Durch die aktive Aufgabe der CPU zum richtigen Zeitpunkt und den sinnvollen Wechsel zwischen Goroutinen kann die Parallelitätsleistung des gesamten Systems verbessert werden.
Arbeitsdiebstahl ist ein sehr wichtiger Mechanismus im Golang-Planer. Seine Kernidee besteht darin, inaktiven Threads zu ermöglichen, aktiv Aufgaben von anderen Threads zur Ausführung zu „stehlen“ und so einen Lastausgleich zwischen Threads zu erreichen. Dieser Mechanismus kann die Situation vermeiden, dass einige Threads zu viel arbeiten, während andere Threads im Leerlauf bleiben, wodurch die Leistung gleichzeitiger Programme weiter verbessert wird.
2. Beispieldemonstration einer Planungsstrategie
Um die Planungsstrategie von Goroutinen besser zu verstehen, schauen wir uns einen einfachen Beispielcode an, um die Auswirkungen verschiedener Planungsstrategien auf gleichzeitige Programme zu untersuchen.
package main import ( "fmt" "runtime" "sync" ) func main() { runtime.GOMAXPROCS(1) // 设置只使用一个CPU核心 var wg sync.WaitGroup wg.Add(2) fmt.Println("Start Goroutines") // 第一个Goroutine go func() { defer wg.Done() for i := 0; i < 3; i++ { fmt.Println("Goroutine 1: ", i) } }() // 第二个Goroutine go func() { defer wg.Done() for i := 0; i < 3; i++ { fmt.Println("Goroutine 2: ", i) } }() fmt.Println("Waiting to finish") wg.Wait() fmt.Println("Terminating the program") }
Im obigen Code legen wir nur einen CPU-Kern über runtime.GOMAXPROCS(1)
fest, um die Auswirkungen verschiedener Planungsstrategien besser beobachten zu können. runtime.GOMAXPROCS(1)
设置只使用一个CPU核心,以便更好地观察不同调度策略的效果。
在运行示例代码时,我们可以观察到以下几种不同调度策略的效果:
通过不断调整runtime.GOMAXPROCS
Es wird nur eine Goroutine ausgeführt. In diesem Fall gibt die Goroutine, die zuerst die Ausführung beendet, die CPU frei und führt andere Goroutinen aus.
Zwei Goroutinen werden abwechselnd ausgeführt. Da es in diesem Fall nur einen CPU-Kern gibt, wechseln die Goroutinen die Ausführung untereinander.
runtime.GOMAXPROCS
ständig anpassen und die Ausgabe des Programms beobachten, können wir die Auswirkungen verschiedener Planungsstrategien auf gleichzeitige Programme besser verstehen. Das obige ist der detaillierte Inhalt vonGolang-Programmierkenntnisse mit hoher Parallelität: Vertiefendes Verständnis der Planungsstrategie von Goroutinen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!