c语言编程笔录

首页 >   > 笔记大全

笔记大全

golang多核设置

更新时间:2023-10-15

多核设置概述

多核处理器已经成为现代计算机的标准配置,但是在默认情况下,Golang并不会直接使用多核,为了充分利用多核处理器的性能,需要进行一些设置。

GOMAXPROCS

GOMAXPROCS是Golang中用于设置最大进程数的环境变量,通过设置该变量,可以充分利用多核处理器。

import (
    "fmt"
    "runtime"
)

func main() {
    n := runtime.NumCPU()         // 获取CPU核心数
    runtime.GOMAXPROCS(n)        // 设置最多使用n个核心
    fmt.Println("核心数:", n)
}

多线程与多进程

在Golang中,使用goroutine来实现并发操作,而goroutine会被映射到操作系统线程上进行执行,因此Golang的并发模型是基于协程的,而不是进程。

为了更好地理解goroutine和线程的关系,可以通过以下示例进行实验:

import (
    "fmt"
    "runtime"
    "sync"
)

func main() {
    runtime.GOMAXPROCS(1)    // 只使用一个核心
    var wg sync.WaitGroup
    wg.Add(2)

    fmt.Println("创建goroutine前:", runtime.NumGoroutine())    // 输出当前goroutine数

    go func() {
        defer wg.Done()
        for i := 0; i < 10; i++ {
            fmt.Printf("A%d ", i)
        }
    }()

    go func() {
        defer wg.Done()
        for i := 0; i < 10; i++ {
            fmt.Printf("B%d ", i)
        }
    }()

    fmt.Println("创建goroutine后:", runtime.NumGoroutine())    // 输出当前goroutine数

    wg.Wait()
}

在该示例中,我们通过设置GOMAXPROCS为1,只使用一个核心来执行goroutine,而在代码中我们创建了两个goroutine,但是只有一个核心在执行,因此这两个goroutine会被分时调度,最终输出结果为交替的"A0 B0 A1 B1 A2 B2 A3 B3 A4 B4 A5 B5 A6 B6 A7 B7 A8 B8 A9 B9 ",而在执行后,我们可以通过runtime.NumGoroutine()函数获取当前执行的goroutine数,根据输出可以看到我们的程序只使用了一个核心。

总结

通过以上说明,我们可以得出如下几点结论:

  • Golang需要设置GOMAXPROCS才能充分利用多核处理器。
  • Golang使用goroutine来实现并发操作,goroutine会被映射到操作系统线程上进行执行。
  • Golang的并发模型是基于协程的,而不是进程。