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!