使用通道同步 Goroutine

GolangGolangBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本实验旨在测试你对使用通道在多个 goroutine 之间同步执行的知识。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("`Golang`")) -.-> go/ConcurrencyGroup(["`Concurrency`"]) go/ConcurrencyGroup -.-> go/channels("`Channels`") subgraph Lab Skills go/channels -.-> lab-15458{{"`使用通道同步 Goroutine`"}} end

通道同步

本实验要解决的问题是创建一个 goroutine,它执行一些工作,并在工作完成时通过一个通道通知另一个 goroutine。

要完成本实验,你需要:

  • 创建一个名为 worker 的函数,它接受一个 bool 类型的通道作为参数。
  • worker 函数内部,执行一些工作,然后向通道发送一个值,以通知工作已完成。
  • main 函数中,创建一个缓冲区大小为 1 的 bool 类型通道。
  • 启动一个调用 worker 函数并将通道作为参数传递的 goroutine。
  • 阻塞 main 函数,直到从通道接收到一个值。
$ go run channel-synchronization.go
working...done

## 如果你从这个程序中删除了 `<- done` 这一行,
## 程序会在 `worker` 甚至还未启动之前就退出。

以下是完整代码:

// 我们可以使用通道在多个 goroutine 之间同步执行。
// 这是一个使用阻塞接收来等待 goroutine 完成的示例。
// 当等待多个 goroutine 完成时,你可能更倾向于使用 [WaitGroup](waitgroups)。

package main

import (
	"fmt"
	"time"
)

// 这是我们将在 goroutine 中运行的函数。
// `done` 通道将用于通知另一个 goroutine 此函数的工作已完成。
func worker(done chan bool) {
	fmt.Print("working...")
	time.Sleep(time.Second)
	fmt.Println("done")

	// 发送一个值以通知我们已完成。
	done <- true
}

func main() {

	// 启动一个 worker goroutine,给它用于通知的通道。
	done := make(chan bool, 1)
	go worker(done)

	// 阻塞,直到我们从通道接收到来自 worker 的通知。
	<-done
}

总结

在本实验中,你学习了如何使用通道在多个 goroutine 之间同步执行。通过创建一个通道并将其传递给一个 goroutine,你可以等待该 goroutine 完成其工作,并在工作完成时通知你。

您可能感兴趣的其他 Golang 教程