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函数中执行的值,否则它不会让其他任何东西执行。
如果我们在上面的代码上使用gorunmain.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) } }输出结果
如果我们在上面的代码上使用gorunmain.go命令,我们将看到以下输出。
欢迎来到...nhooo 从这里学习Go!