我正在与一些大学生一起担任一个高级顶点项目的导师。我已经要求使用 GoLang。它将涉及处理多个文件,并进行多个阶段的处理。使用 goroutine 管道似乎是个好主意。
每个文件处理过程中都会有状态信息记录。我认为创建一个
strings.Builder
实例来收集状态消息并将 Builder
添加到上下文中以处理每个文件是一个好主意。我知道上下文是静态的。可以向管道中每个阶段添加的上下文添加 Builder
吗?
或者这只是一个坏主意?如果不好,您有替代推荐吗?他们是否可以多次将某种结构类型添加到上下文中,然后最后遍历上下文并收集所有实例,然后输出每个文件的报告?
这可能是一个坏主意。上下文意味着在多个 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