concurrency - 我什么时候应该在 Go 中使用并发?

标签 concurrency go

那么除了处理多个服务器请求之外,还有其他时间与并发相关吗?我问是因为它是如此内置于语言中,如果我不使用它,我会觉得很浪费,但我几乎找不到它的用途。

最佳答案

(还)不是 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/

相关文章:

java - 为什么 `h`这个参数在AbstractQueuedSynchronizer中会判断两次是否为null?

go - 多个 goroutine 在一个 channel 上监听

python - 与进程池执行程序一起运行多个进程的 Tornado 并发错误

java - 运行两个线程时出现 ConcurrentModificationException 问题

Golang rest api并发

pointers - 为什么要使用指针(性能)?

创建后 Gorm 只读字段

go - 使用多个 goroutines 写入同一个 channel

go - 将请求中的json转换为golang中的数组

go - 是否可以动态加载 Go 代码?