context,go的上下文存储&并发控制之道
warning:
这篇文章距离上次修改已过201天,其中的内容可能已经有所变动。
在Go语言中,context包提供了用于在goroutine之间传递上下文信息的机制。以下是一个使用context包的简单示例,展示了如何在goroutine之间同步和控制并发操作:
package main
import (
"context"
"fmt"
"sync"
"time"
)
func worker(ctx context.Context, wg *sync.WaitGroup, id int) {
defer wg.Done()
for {
select {
case <-ctx.Done():
fmt.Printf("Worker %d is exiting.\n", id)
return
default:
fmt.Printf("Worker %d is running.\n", id)
time.Sleep(1 * time.Second)
}
}
}
func main() {
var wg sync.WaitGroup
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
// 启动两个goroutines
wg.Add(2)
go worker(ctx, &wg, 1)
go worker(ctx, &wg, 2)
// 等待5秒后取消上下文
time.Sleep(5 * time.Second)
cancel()
// 等待所有goroutines完成
wg.Wait()
}
这段代码创建了一个有5秒超时的上下文,并启动了两个goroutines执行worker函数。每个worker会在一个无限循环中打印信息,直到上下文被取消。使用sync.WaitGroup
确保主函数在所有goroutines完成后才退出。这个例子展示了如何使用context来控制并发操作的生命周期和资源清理。
评论已关闭