menu arrow_back 湛蓝安全空间 |狂野湛蓝,暴躁每天 chevron_right All_wiki chevron_right the-way-to-go_ZH_CN chevron_right eBook chevron_right 14.13.md
  • home 首页
  • brightness_4 暗黑模式
  • cloud
    xLIYhHS7e34ez7Ma
    cloud
    湛蓝安全
    code
    Github
    14.13.md
    1.62 KB / 2024-07-16 23:14:28
        # 14.13 在多核心上并行计算
    
    假设我们有 `NCPU` 个 CPU 核心:`const  NCPU = 4 //对应一个四核处理器` 然后我们想把计算量分成 `NCPU` 个部分,每一个部分都和其他部分并行运行。
    
    这可以通过以下代码所示的方式完成(我们且省略具体参数)
    
    ```go
    func DoAll(){
        sem := make(chan int, NCPU) // Buffering optional but sensible
        for i := 0; i < NCPU; i++ {
            go DoPart(sem)
        }
        // Drain the channel sem, waiting for NCPU tasks to complete
        for i := 0; i < NCPU; i++ {
            <-sem // wait for one task to complete
        }
        // All done.
    }
    
    func DoPart(sem chan int) {
        // do the part of the computation
        sem <-1 // signal that this piece is done
    }
    
    func main() {
        runtime.GOMAXPROCS(NCPU) // runtime.GOMAXPROCS = NCPU
        DoAll()
    }
    ```
    
    - `DoAll()` 函数创建了一个 `sem` 通道,每个并行计算都将在对其发送完成信号;在一个 `for` 循环中 `NCPU` 个协程被启动了,每个协程会承担 `1/NCPU` 的工作量。每一个 `DoPart()` 协程都会向 `sem` 通道发送完成信号。
    
    - `DoAll()` 会在 `for` 循环中等待 `NCPU` 个协程完成:`sem` 通道就像一个信号量,这份代码展示了一个经典的信号量模式。(参见 [14.2.7](14.2.md#1427-%E4%BF%A1%E5%8F%B7%E9%87%8F%E6%A8%A1%E5%BC%8F))
    
    在以上运行模型中,您还需将 `GOMAXPROCS` 设置为 `NCPU`(参见 [14.1.3](14.1.md#1413-%E4%BD%BF%E7%94%A8-gomaxprocs))。
    
    
    ## 链接
    
    - [目录](directory.md)
    - 上一节:[协程链](14.12.md)
    - 下一节:[并行化大量数据的计算](14.14.md)
    
    
    links
    file_download