技术文摘
Go 语言中用 Channel 或 Context 实现协程等待的方法
2025-01-09 01:36:58 小编
Go 语言中用 Channel 或 Context 实现协程等待的方法
在Go语言中,协程(goroutine)是一种轻量级的并发执行单元。但在实际开发中,我们常常需要等待多个协程完成任务后再继续执行后续的代码。这时候,Channel和Context就成为了实现协程等待的有效方法。
Channel实现协程等待
Channel是Go语言中用于协程间通信的重要机制。通过创建一个通道,我们可以在主协程中等待子协程向通道发送完成信号。
例如,我们创建一个done通道,在每个子协程完成任务后向done通道发送一个空结构体。主协程则通过接收done通道的数据来判断子协程是否完成。当接收到足够数量的信号后,主协程就知道所有子协程都已完成任务。
以下是一个简单的示例代码:
package main
import "fmt"
func worker(done chan struct{}) {
// 模拟任务执行
fmt.Println("子协程执行任务")
done <- struct{}{}
}
func main() {
done := make(chan struct{})
go worker(done)
<-done
fmt.Println("所有协程任务完成")
}
Context实现协程等待
Context主要用于在多个协程之间传递截止日期、取消信号等上下文信息。我们可以通过context.WithCancel函数创建一个可取消的上下文,然后在子协程中监听上下文的取消信号。
当主协程需要等待子协程完成时,它可以通过调用cancel函数来发送取消信号,子协程接收到信号后会停止执行。主协程可以通过select语句来监听子协程的完成信号和上下文的取消信号。
示例代码如下:
package main
import (
"context"
"fmt"
)
func worker(ctx context.Context) {
select {
case <-ctx.Done():
fmt.Println("子协程收到取消信号,停止执行")
}
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
go worker(ctx)
// 模拟等待一段时间后取消
// 实际应用中可以根据具体情况决定何时取消
cancel()
fmt.Println("主协程发送取消信号")
}
通过Channel和Context,我们可以灵活地实现协程的等待和协调,提高Go语言程序的并发性能和可靠性。
- Spring Boot 2.0 新增事件 ApplicationStartedEvent(二)
- Java 中 Lambda 函数式编程的应用实例与链式语法解析
- 前端常用开发工具的路径解析设置
- 若高考考查 Python,这些题目你能否应对?
- 论 FPGA 与音频处理器的融合
- GitHub 被收购背后:工作体验如何?
- Python 薪资缘何高于 Java、PHP 、C#?
- 谈谈契约测试
- 从新视角探讨性能测试问题与实践学习
- Python 与 PHP、Java 等四大流行语言较量,孰优孰劣?
- 100 万行代码背后的程序员是何种模样
- 常见并发编程错误全解析
- Java 枚举:程序员必备开发技巧 「简洁安全的代码」
- 开发软件中促使不同团队协同合作的 10 个要点
- 微软怎样处置 GitHub 上有争议的代码?