Golang 中的通道同步
如果我們想同步 **goroutine**,可以使用 **通道**。透過同步,我們希望使 **goroutine** 以定義的方式工作,例如,在前面的 **goroutine** 完成執行之前,不啟動下一個 **goroutine**。
**通道** 有助於實現這一點,因為它們可以用來阻塞程序,然後也可以用來通知第二個 **goroutine** 前面的 **goroutine** 已完成其工作。
示例 1
讓我們考慮一個通道同步的基本示例,我們將看到如何藉助緩衝通道來實現它。
請考慮以下程式碼。
package main
import (
"fmt"
"time"
)
func check(done chan bool) {
fmt.Print("Welcome to...")
time.Sleep(time.Second)
fmt.Println("TutorialsPoint")
done <- true
}
func main() {
done := make(chan bool, 1)
go check(done)
<-done
}
在上面的程式碼中,我們同步了程式碼,因為 <- done 只是阻塞了程式碼,除非並且直到它收到值(我們在 check 函式內部執行此操作),否則它不會允許任何其他內容執行。
如果我們對上述程式碼使用命令 **go run main.go**,我們將看到以下輸出。
輸出
Welcome to...TutorialsPoint
示例 2
上述示例可用於進一步增強同步,因為它可以使一個 **goroutine** 等待另一個 **goroutine**。
請考慮以下程式碼。
package main
import (
"fmt"
"time"
)
func check(done chan bool) {
fmt.Print("Welcome to...")
time.Sleep(time.Second)
fmt.Println("TutorialsPoint")
done <- true
}
func check2() {
fmt.Println("Learn Go from here!")
}
func main() {
done := make(chan bool, 1)
go check(done)
if <-done {
go check2()
time.Sleep(time.Second)
}
}輸出
如果我們對上述程式碼使用命令 **go run main.go**,我們將看到以下輸出。
Welcome to...TutorialsPoint Learn Go from here!
廣告
資料結構
網路
關係型資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP