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!

相关文章