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