登录
首页 >  Golang >  Go问答

如何在单独 goroutine 中执行闭包时传递 context.Context 的最佳实践

来源:stackoverflow

时间:2024-03-07 10:42:24 141浏览 收藏

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《如何在单独 goroutine 中执行闭包时传递 context.Context 的最佳实践》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!

问题内容

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”。从技术上来说,这是无意义的。但这是一个常见的困惑。 Goroutine 是轻量级的执行线程。函数是一段代码。它们不是同一件事,因此将函数或闭包称为 goroutine 并没有真正的意义。更多详情请参阅this answer

今天关于《如何在单独 goroutine 中执行闭包时传递 context.Context 的最佳实践》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>