Golang 中的通道同步


如果我们想同步 **goroutine**,可以使用 **通道**。通过同步,我们希望使 **goroutine** 以定义的方式工作,例如,在前面的 **goroutine** 完成执行之前,不启动下一个 **goroutine**。

**通道** 有助于实现这一点,因为它们可以用来阻塞进程,然后也可以用来通知第二个 **goroutine** 前面的 **goroutine** 已完成其工作。

示例 1

让我们考虑一个通道同步的基本示例,我们将看到如何借助缓冲通道来实现它。

请考虑以下代码。

Open Compiler
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

Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.

示例 2

上述示例可用于进一步增强同步,因为它可以使一个 **goroutine** 等待另一个 **goroutine**。

请考虑以下代码。

Open Compiler
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+ 次查看

启动您的 职业生涯

通过完成课程获得认证

开始
广告