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!
廣告