2012-11-05 18 views
8

我是Google Go(Golang)的新手。我的問題是關於這個職位What exactly does runtime.Gosched do?。代碼的結構如下所示。我的問題是,當我更改GOMAXPROCS中的處理器數量時,如何驗證它運行的處理器數量。當我做'頂部'時,它會顯示a.out流程,即使GOMAXPROCS超過1,也會消耗100%或更少的資源。我將非常感謝您的幫助。Golang:如何驗證Go程序正在運行的處理器數

package main 

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

var wg sync.WaitGroup 

func doTasks() { 
    fmt.Println(" Doing task ") 
    for ji := 1; ji < 100000000; ji++ { 
     for io := 1; io < 10; io++ { 
      //Some computations 
     } 
    } 
    runtime.Gosched() 

    wg.Done() 
} 

func main() { 
    wg.Add(1) 
    runtime.GOMAXPROCS(1) // or 2 or 4 
    go doTasks() 
    doTasks() 
    wg.Wait() 
} 
+0

你正在測試這個操作系統?此外,知道您使用哪個CPU會很有幫助。我無法重現這種行爲。 – nemo

+0

cat/etc/* - 發佈返回:紅帽企業Linux工作站版本6.3(聖地亞哥)。操作系統是Linux。 CPU是Intel(R)Xeon(R)CPU,X5460 @ 3.16GHz。 NumCPU返回8. – user984260

+0

@nemo程序運行良好。只有我很好奇如何查看它正在運行的處理器的數量 – user984260

回答

24

在給定時間內進程可以運行的最大邏輯CPU數不超過runtime.GOMAXPROCS(0)runtime.NumCPU()的最小值。

func MaxParallelism() int { 
    maxProcs := runtime.GOMAXPROCS(0) 
    numCPU := runtime.NumCPU() 
    if maxProcs < numCPU { 
     return maxProcs 
    } 
    return numCPU 
} 
+0

+1這看起來像一個正確的解決方案(或者至少有趣)。但是,你是否有一些關於缺乏更好和更持久方法的資料? –

+0

不知道它是否只是我,但MaxParallelism在我的2011 Macbook Air和運行Debian 7的8核英特爾服務器上返回0。 我的解決方法是使用runtime.NumCPU,它返回4爲MBA(每個2核上2個線程)和服務器上有8個CPU(有8個非超線程核心XEON)。 使用Go 1.2完成測試。 –

+0

@PeterKrnjevic:我無法重現這一點。 Macbook air 10.9,去1.2。 –

2

核心數可以通過http://golang.org/pkg/runtime/#NumCPU進行查詢。

該文檔說:「NumCPU返回本地計算機上的邏輯CPU數量。」

+1

謝謝。但是,我想問一下,如何知道當前正在運行的程序的CPU數量。這個數字小於或等於NumCPU。 – user984260

相關問題