Mit der kontinuierlichen Weiterentwicklung der Computertechnologie sind Multicore-CPUs zum Standard geworden. Gleichzeitige Programmierung ist in der heutigen Softwareentwicklung äußerst wichtig, und die Go-Sprache hat sich aufgrund ihres einzigartigen Parallelitätsmechanismus zu einer der beliebtesten gleichzeitigen Programmiersprachen entwickelt. In diesem Artikel besprechen wir die Konzepte und Techniken der gleichzeitigen Programmierung in der Go-Sprache.
Parallelität bedeutet, dass zwei oder mehr Ereignisse innerhalb desselben Zeitintervalls auftreten. In der Informatik bedeutet dies, dass innerhalb desselben Zeitintervalls mehrere Aufgaben gleichzeitig ausgeführt werden können. Unter gleichzeitiger Programmierung versteht man die Programmiertechnologie zum Schreiben von Programmen, die mehrere Aufgaben gleichzeitig ausführen können.
Die Konzepte der gleichzeitigen Programmierung und der parallelen Programmierung sind unterschiedlich. Unter gleichzeitiger Programmierung versteht man die gleichzeitige Ausführung mehrerer Aufgaben, während unter paralleler Programmierung die gleichzeitige Ausführung mehrerer Aufgaben auf mehreren Prozessoren oder Verarbeitungskernen verstanden wird. Im Computerbereich werden Parallelität und Parallelität oft synonym verwendet, sie unterscheiden sich jedoch grundlegend.
Die Go-Sprache unterstützt die gleichzeitige Programmierung sowohl in der Syntax als auch zur Laufzeit. Goroutine ist in der Go-Sprache ein extrem leichter Thread. Eine Goroutine muss zum Ausführen nur wenig Stapelplatz beanspruchen. Gleichzeitig kann ein Go-Programm über Tausende von Goroutinen verfügen, was es einem Go-Programm ermöglicht, gleichzeitige Aufgaben effizient auszuführen.
Parallelität in der Go-Sprache übernimmt das CSP-Parallelitätsmodell, das den Speicher durch Kommunikation teilt, anstatt über den gemeinsamen Speicher zu kommunizieren. In der Go-Sprache können wir Kanäle verwenden, um die Kommunikation zwischen Goroutinen zu implementieren.
Sie können einen Kanal auf folgende Weise definieren:
ch := make(chan int)
Verwenden Sie das integrierte Schlüsselwort go
der Go-Sprache, um eine Goroutine zu starten: go
关键字来启动一个 Goroutine:
go printHelloWorld()
在这段代码中,printHelloWorld()
是一个函数,通过 go
关键字启动的这个 Goroutine 会在一个新的线程独立运行。
3.1 使用 channel 来协调 Goroutine
如上所述,在Go语言中,我们可以使用 channel 来实现 Goroutine 之间的通信。channel 可以用于两个或多个 Goroutine 之间的协调,以及对共享资源的控制。
package main import "fmt" func hello(done chan bool) { fmt.Println("Hello world Goroutine") done <- true } func main() { done := make(chan bool) go hello(done) <-done fmt.Println("main function") }
在这段代码中,我们在 hello()
函数外部定义了一个 done
channel,并将其传递给 hello()
函数。在 hello()
函数中,我们打印了一条消息,并将 true
值写入了 done
channel 中,表示 hello()
函数执行完毕。在 main()
函数中,我们通过 <-done
语法从 channel 中读取数据,等待 hello()
函数执行完毕并将 true
值写入 done
channel 中。这样,我们就实现了 Goroutine 的协调。
3.2 使用 select 语句
select 语句可以用于同时处理多个 channel 操作。在 select 语句中,我们可以定义多个 channel,然后通过一组 case 语句来处理它们。
package main import ( "fmt" "time" ) func main() { ch1 := make(chan int) ch2 := make(chan string) go func() { ch1 <- 1 }() go func() { ch2 <- "hello" }() for i := 0; i < 2; i++ { select { case num := <-ch1: fmt.Println("ch1:", num) case str := <-ch2: fmt.Println("ch2:", str) case <-time.After(time.Millisecond * 100): fmt.Println("timeout") } } }
在这段代码中,我们定义了 ch1
和 ch2
两个 channel,并启动了两个 Goroutine,分别向这两个 channel 中写入数据。在 main()
函数中,我们通过一个 for 循环来处理这两个 channel 的输入,使用 select 语句来选择其中一个可用的 channel 并处理其输入。如果在一个固定时间内没有 channel 可以使用,我们可以使用 time.After()
rrreee
printHelloWorld( ) code> ist eine Funktion, die über das Schlüsselwort <code>go
gestartet wird und unabhängig in einem neuen Thread ausgeführt wird. 3.1 Verwenden Sie Kanäle, um Goroutinen zu koordinieren
🎜Wie oben erwähnt, können wir in der Go-Sprache Kanäle verwenden, um die Kommunikation zwischen Goroutinen zu implementieren. Kanäle können zur Koordination zwischen zwei oder mehr Goroutinen und zur Steuerung gemeinsam genutzter Ressourcen verwendet werden. 🎜rrreee🎜In diesem Code definieren wir einendone
-Kanal außerhalb der Funktion hello()
und übergeben ihn an die Funktion hello()
. In der Funktion hello()
drucken wir eine Nachricht und schreiben den Wert true
in den Kanal done
, der hello() Die Funktionsausführung ist abgeschlossen. In der Funktion <code>main()
lesen wir Daten aus dem Kanal über die Syntax <-done
und warten auf die Funktion hello()
Complete und schreibt den true
-Wert in den done
-Kanal. Auf diese Weise erreichen wir eine Goroutine-Koordination. 🎜🎜3.2 Verwenden Sie die Select-Anweisung🎜🎜Mit der Select-Anweisung können mehrere Kanaloperationen gleichzeitig verarbeitet werden. In der Select-Anweisung können wir mehrere Kanäle definieren und diese dann über eine Reihe von Case-Anweisungen verarbeiten. 🎜rrreee🎜In diesem Code haben wir zwei Kanäle definiert, ch1
und ch2
, und zwei Goroutinen gestartet, um jeweils Daten in diese beiden Kanäle zu schreiben. In der Funktion main()
verarbeiten wir die Eingabe dieser beiden Kanäle über eine for-Schleife und verwenden die select-Anweisung, um einen der verfügbaren Kanäle auszuwählen und seine Eingabe zu verarbeiten. Wenn innerhalb eines festgelegten Zeitraums kein Kanal verfügbar ist, können wir die Funktion time.After()
verwenden, um die Timeout-Verarbeitung zu implementieren. 🎜🎜🎜Fazit🎜🎜🎜In diesem Artikel haben wir die Konzepte und Techniken der gleichzeitigen Programmierung in der Go-Sprache besprochen. Durch Goroutine und Channel können wir gleichzeitige Programmierung effizient implementieren. Beim Schreiben gleichzeitiger Programme sollten wir einige grundlegende Techniken befolgen, z. B. die Verwendung von Kanälen zur Koordinierung von Goroutinen und die Verwendung von Select-Anweisungen zur Synchronisierung der Ausführung mehrerer Goroutinen. Diese Techniken können uns helfen, effiziente und stabile gleichzeitige Programme zu schreiben. 🎜
Das obige ist der detaillierte Inhalt vonKonzepte und Techniken der gleichzeitigen Programmierung in der Go-Sprache. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!