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!

更新於: 2021年11月1日

1K+ 次檢視

啟動您的 職業生涯

透過完成課程獲得認證

開始
廣告