可以将 strings.builder 放入上下文中来收集 goroutine 管道的输出吗?

问题描述 投票:0回答:1

我正在与一些大学生一起担任一个高级顶点项目的导师。我已经要求使用 GoLang。它将涉及处理多个文件,并进行多个阶段的处理。使用 goroutine 管道似乎是个好主意。

每个文件处理过程中都会有状态信息记录。我认为创建一个

strings.Builder
实例来收集状态消息并将
Builder
添加到上下文中以处理每个文件是一个好主意。我知道上下文是静态的。可以向管道中每个阶段添加的上下文添加
Builder
吗?

或者这只是一个坏主意?如果不好,您有替代推荐吗?他们是否可以多次将某种结构类型添加到上下文中,然后最后遍历上下文并收集所有实例,然后输出每个文件的报告?

go goroutine
1个回答
0
投票

这可能是一个坏主意。上下文意味着在多个 goroutine 之间共享,因此上下文中拥有一个构建器意味着在 goroutine 之间共享一个构建器。您将遇到数据竞争。

但是,您可以创建一个 goroutine,从通道读取字符串并使用构建器构建一个大字符串,或者保留一段字符串。您可以将通道放入上下文中,因此所有消息都会在此 goroutine 中结束。当上下文取消时,您可以从 goroutine 返回。您需要小心如何从 goroutine 获取结果字符串。您可以使用另一个通道来请求字符串的当前副本,或者您可以让 goroutine 在完成之前通过另一个通道发送结果字符串。像这样的东西:

ch:=make(chan string)
result:=make(chan string)
newCtx:=context.WithValue(ctx,"msgCh",ch)
go func() {
  msg:=strings.Builder{}
  defer func() {
     result<-msg.String()
  }()
  for {
     select {
        case str:=<-ch:
           builder.WriteString(str)
        case <-newCtx.Done():
            return
     }
  }
}()
...
// cancel context
...
msg:=<-result

© www.soinside.com 2019 - 2024. All rights reserved.