Golang 中的通道同步

如果我们想同步goroutines,我们可以使用通道。通过同步,我们希望让goroutine以定义的方式工作,例如,在前一个goroutine 执行完成之前不启动下一个goroutine

渠道实现的是,因为它们可以被用来阻止过程,然后帮助,也可用于通知第二够程,以前的够程已经完成了它的任务。

示例 1

让我们考虑一个非常基本的通道同步示例,我们将看到如何在缓冲通道的帮助下实现它。

考虑下面显示的代码。

package main

import (
   "fmt"
   "time"
)

func check(done chan bool) {
   fmt.Print("欢迎来到...")
   time.Sleep(time.Second)
   fmt.Println("nhooo")

   done <- true
}

func main() {
   done := make(chan bool, 1)
   go check(done)

   <-done
}

在上面的代码中,我们同步了代码,因为 <- done 只是阻塞了代码,除非并且直到它接收到我们在 check 函数中执行的值,否则它不会让其他任何东西执行。

如果我们在上面的代码上使用go run main.go命令,我们将看到以下输出。

输出结果

欢迎来到...nhooo

示例 2

上面的例子可以用来进一步增强同步,因为我们可以让一个goroutine等待另一个goroutine

考虑下面显示的代码。

package main

import (
   "fmt"
   "time"
)

func check(done chan bool) {
   fmt.Print("欢迎来到...")
   time.Sleep(time.Second)
   fmt.Println("nhooo")

   done <- true
}

func check2() {
   fmt.Println("从这里学习 Go!")
}

func main() {
   done := make(chan bool, 1)
   go check(done)

   if <-done {
      go check2()
      time.Sleep(time.Second)
   }
}
输出结果

如果我们在上面的代码上使用go run main.go命令,我们将看到以下输出。

欢迎来到...nhooo
从这里学习 Go!