gpt4 book ai didi

go - 将 context.Context 传递给在单独的 goroutine 中执行的闭包的最佳方法

转载 作者:IT王子 更新时间:2023-10-29 01:40:35 25 4
gpt4 key购买 nike

context.Context 传递给闭包以在单独的 goroutine 中执行的最佳方法是什么?

因为我没有在闭包内改变 context.Context,所以我假设这两个选项都是有效的。第二个选项可以通过不复制界面来为我节省一点内存。

1) 作为参数传递

func run(ctx context.Context) {
for i := 0; i <= 5; i++ {
go func(id int, ictx context.Context) {
for {
select {
case <- ictx.Done():
return
default:
// do something
}
}
}(i, ctx)
}
}

2) 公开外部上下文变量

func run(ctx context.Context) {
for i := 0; i <= 5; i++ {
go func(id int) {
for {
select {
case <- ctx.Done():
return
default:
// do something
}
}
}(i)
}
}

最佳答案

两者都应该没问题。要记住的关键是上下文是不可变的。这意味着当您尝试读取上下文时,不存在其他 goroutine 正在更新上下文的竞争条件风险,因此您无需担心正常的同步方法。

所以简而言之,不需要什么特别的,所以 #2 就可以了。由于 #1 实际上并未执行闭包,因此在您想要执行带上下文参数的命名函数的情况下它是理想的


术语说明:您最初的问题(为清晰起见,我对其进行了编辑)询问的是执行“闭包中的 goroutine”。从技术上讲,这是无稽之谈。但这是一个常见的混淆。 Goroutines 是轻量级的执行线程。函数是一些代码。它们不是一回事,因此将函数或闭包称为 goroutines 并没有真正意义。参见 this answer了解更多详情。

关于go - 将 context.Context 传递给在单独的 goroutine 中执行的闭包的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54976927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com