3 回答
TA贡献1824条经验 获得超6个赞
渠道是解决这个问题的最佳方式。这是一个可以在go playground上运行的示例。
package main
import "fmt"
import "sync"
import "runtime"
type T int
func main() {
var slice []T
var wg sync.WaitGroup
queue := make(chan T, 1)
// Create our data and send it into the queue.
wg.Add(100)
for i := 0; i < 100; i++ {
go func(i int) {
defer wg.Done()
// Do stuff.
runtime.Gosched()
queue <- T(i)
}(i)
}
// Poll the queue for data and append it to the slice.
// Since this happens synchronously and in the same
// goroutine/thread, this can be considered safe.
go func() {
defer wg.Done()
for t := range queue {
slice = append(slice, t)
}
}()
// Wait for everything to finish.
wg.Wait()
fmt.Println(slice)
}
注意:runtime.Gosched()调用存在是因为这些 goroutine 不会让步给调度程序。如果我们没有明确地做一些事情来触发所述调度程序,这将导致死锁。另一种选择可能是执行一些 I/O(例如:打印到标准输出)。但我发现 aruntime.Gosched()的意图更容易和更清晰。
- 3 回答
- 0 关注
- 387 浏览
添加回答
举报