14.13. 多核运算

未匹配的标注

假设我们的 CPU 核数是 NCPU 个: const NCPU = 4 // 例如:4 代表4核处理器,我们将计算划分为 NCPU 部分,每部分与其他部分并行运行。

下面是一个简单的示例(我们忽略具体的参数):

func DoAll() {

    sem := make(chan int, NCPU)

    for i := 0; i < NCPU; i++ {

        // Buffering optional but sensible. 合理的缓冲区选项(个人理解就是和 CPU 的核心数相同)

        go DoPart(sem)

    }

    // 等待 NCPU 任务完成,释放通道 sem 的缓冲区

    for i := 0; i < NCPU; i++ {

        <-sem // 等待一个任务完成

    }

    // 全部完成。

}

func DoPart(sem chan int) {

    // 进行计算的部分
    ...

    sem <- 1 // 发送一个这部分已经完成的信号,用来释放 sem 的缓冲区

}

func main() {

    runtime.GOMAXPROCS = NCPU

    DoAll()

}
  • 函数 DoAll() 生成一个通道 sem ,在此基础上完成每一个并行计算;在 for 循环中启动 NCPU 个协程,每一个协程执行全部工作的 1/NCPU 。通过 sem 发送每一个协程中 DoPart() 完成的信号。

  • DoAll() 中用一个 for 循环来等待所有 (NCPU 个)协程完成计算: 通道 sem 的行为就像一个 semaphore(信号量) ;这个代码展示了一个典型的 信号量模式(可以参见 14.2.7章节

在当前的运行模式下,你还必须设置 GOMAXPROCSNCPU(可以参见 14.1.3

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/the-way-to-go/1...

译文地址:https://learnku.com/docs/the-way-to-go/1...

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~