协程与 channel 的配合可实现并发编程,提升程序性能和吞吐量,通过 channel,协程可以安全高效地通信和交换数据,主要步骤如下:创建 channel 接收任务。启动多个协程从 channel 接收并处理任务。在主线程创建任务并发送到 channel。关闭 channel 告知协程没有更多任务。使用 sync.waitgroup 等待所有协程完成。
Golang 协程与 Channel 的配合
简介
协程是一种用户态轻量级线程,与进程或线程相比,协程的创建和销毁消耗更少的资源。Channel 是 Go 语言中用于 goroutine 之间进行通信的一种机制。协程和 channel 的结合可以实现并发编程,从而提高程序的性能和吞吐量。
实战案例
让我们通过一个实战案例来展示协程与 channel 的配合。此案例将展示如何并行处理一组任务。
// 任务定义
type Task struct {
ID int
Data []int
}
// 任务处理函数
func processTask(task *Task) {
// 耗时处理
fmt.Printf("Processing task %d\\n", task.ID)
time.Sleep(time.Second * 2)
}
func main() {
// 创建一个 channel 用于接收任务
tasks := make(chan *Task, 10)
// 启动 4 个协程来处理任务
for i := 0; i < 4; i++ {
go func() {
for {
// 从 channel 中接收任务
task := <-tasks
// 处理任务
processTask(task)
}
}()
}
// 创建任务并将其发送到 channel
for i := 0; i < 10; i++ {
task := &Task{
ID: i,
Data: []int{i, i + 1, i + 2},
}
tasks <- task
}
// 关闭 channel 告知协程没有更多任务
close(tasks)
// 等待所有协程完成
var wg sync.WaitGroup
wg.Add(4)
for i := 0; i < 4; i++ {
go func() {
// 协程退出时通知WaitGroup
wg.Done()
}()
}
wg.Wait()
}



腾讯云 12-20 广告

