LoginSignup
2
0

More than 3 years have passed since last update.

ゴルーチン利用時に使用するCPUを制限する[失敗編]

Last updated at Posted at 2019-07-12

ゴルーチンを利用するときに、使用するCPUの数が指定できるらしく少し試してみました。

CPU数を1つに指定

runtime.GOMAXPROCSを利用することで、利用するCPUが制限できるらしい。
以下のソースだと、CPUを1つしか使わないはず。
ちなみに、runtime.GOMAXPROCSを指定しないと全てのCPUを利用するらしい。

ソース

main.go
package main

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

func main() {
    DATE_TIME_FORMAT := "15:04:05"
    start := time.Now().Format(DATE_TIME_FORMAT)
    fmt.Println("処理開始", start)

    var wg sync.WaitGroup
    runtime.GOMAXPROCS(1) // <---- CPU数を指定できる

    for i := 0; i < 10; i++ {
        wg.Add(1) // WaitGroupに、ゴルーチンを1つずつ追加
        go goroutine(i, &wg)
        PrintMemory()
    }

    wg.Wait() // すべての並列処理が終わるのをまつ

    end := time.Now().Format(DATE_TIME_FORMAT)
    fmt.Println("処理終了", end)
}

func goroutine(i int, wg *sync.WaitGroup) {
    defer wg.Done()              // 並列処理が終わったよ
    time.Sleep(10 * time.Second) // 10秒待つ
}

// PrintMemory メモリ調査
func PrintMemory() {
    var mem runtime.MemStats

    runtime.ReadMemStats(&mem)
    fmt.Println(mem.Alloc, mem.TotalAlloc, mem.HeapAlloc, mem.HeapSys)
}

結果

実行した結果が、こちら
10秒待機する処理を、10回まわしているが
並行処理を行っているため、10秒で完了している。

処理開始 23:46:23
200144 200144 200144 4096000
201056 201056 201056 4096000
201536 201536 201536 4096000
202144 202144 202144 4063232
202624 202624 202624 4063232
203104 203104 203104 4063232
203584 203584 203584 4063232
204064 204064 204064 4030464
204544 204544 204544 4030464
205024 205024 205024 4030464
処理終了 23:46:33

CPU数を4つに指定

変更箇所は以下

    max_cpu := runtime.NumCPU() // 搭載CPUの数が分かる
    fmt.Println("cpu数", max_cpu)
    runtime.GOMAXPROCS(max_cpu) // <---- CPU数を指定できる

runtime.NumCPU()で搭載CPU数が分かるらしい。

ソース

main.go
package main

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

func main() {
    DATE_TIME_FORMAT := "15:04:05"
    start := time.Now().Format(DATE_TIME_FORMAT)
    fmt.Println("処理開始", start)

    var wg sync.WaitGroup
    max_cpu := runtime.NumCPU() // 搭載CPUの数が分かる
    fmt.Println("cpu数", max_cpu)
    runtime.GOMAXPROCS(max_cpu) // <---- CPU数を指定できる

    for i := 0; i < 10; i++ {
        wg.Add(1) // WaitGroupに、ゴルーチンを1つずつ追加
        go goroutine(i, &wg)
        PrintMemory()
    }

    wg.Wait() // すべての並列処理が終わるのをまつ

    end := time.Now().Format(DATE_TIME_FORMAT)
    fmt.Println("処理終了", end)
}

func goroutine(i int, wg *sync.WaitGroup) {
    defer wg.Done()              // 並列処理が終わったよ
    time.Sleep(10 * time.Second) // 10秒待つ
}

// PrintMemory メモリ調査
func PrintMemory() {
    var mem runtime.MemStats

    runtime.ReadMemStats(&mem)
    fmt.Println(mem.Alloc, mem.TotalAlloc, mem.HeapAlloc, mem.HeapSys)
}

結果

時間もメモリともにほとんど変化なし。
ただ、搭載CPU数は正しく取得できている。

簡単な処理内容のため差が出ていないのか、
自分の利用方法が間違っているのか不明。

処理開始 23:54:12
cpu数 4
199968 199968 199968 4096000
200968 200968 200968 4063232
201720 201720 201720 4063232
202360 202360 202360 4063232
202968 202968 202968 4063232
203640 203640 203640 4063232
204248 204248 204248 4030464
204856 204856 204856 4030464
205464 205464 205464 4030464
206200 206200 206200 4030464
処理終了 23:54:22

結論

ネット上から情報を集めてテキトーに試したため、想定通り動作しなかった。
キチンと勉強しないとダメですね。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0