Golang 中的通道同步
go programmingserver side programmingprogramming
如果想要同步 goroutines,可以使用 通道。通过同步,我们希望使 goroutines 以定义的方式工作,例如,在前一个 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!