那么除了处理多个服务器请求之外,还有其他时间与并发相关吗?我问是因为它是如此内置于语言中,如果我不使用它,我会觉得很浪费,但我几乎找不到它的用途。
最佳答案
(还)不是 Go
方面的专家,但我想说:
只要最容易这样做。
Go
中并发模型的美妙之处在于,它从根本上不是一个多核架构,它在事情通常会中断的地方进行检查和平衡——它是一种多线程范式,不仅非常适合在多核架构中,它也非常适合分布式系统架构。
您不必为多个 goroutines
进行特殊安排就可以和谐地协同工作 - 他们就是这样做的!
这是一个自然并发算法的示例 - 我想将多个 channel 合并为一个。一旦所有输入 channel 都用完,我想关闭输出 channel 。
使用并发更简单——事实上它甚至不像并发——它看起来几乎是程序化的。
/*
Multiplex a number of channels into one.
*/
func Mux(channels []chan big.Int) chan big.Int {
// Count down as each channel closes. When hits zero - close ch.
var wg sync.WaitGroup
wg.Add(len(channels))
// The channel to output to.
ch := make(chan big.Int, len(channels))
// Make one go per channel.
for _, c := range channels {
go func(c <-chan big.Int) {
// Pump it.
for x := range c {
ch <- x
}
// It closed.
wg.Done()
}(c)
}
// Close the channel when the pumping is finished.
go func() {
// Wait for everyone to be done.
wg.Wait()
// Close.
close(ch)
}()
return ch
}
这里我必须对并发做出的唯一让步是使用 sync.WaitGroup
作为并发计数的计数器。
请注意,这不完全是我自己的工作——我在这方面得到了很多帮助 here .
关于concurrency - 我什么时候应该在 Go 中使用并发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19747950/