Golang 中的通道同步


如果我们想同步 **goroutine**,可以使用 **通道**。通过同步,我们希望使 **goroutine** 以定义的方式工作,例如,在前面的 **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!

更新于: 2021年11月1日

1K+ 次查看

启动您的 职业生涯

通过完成课程获得认证

开始
广告