2012-11-05 10 views
8

Google Go (Golang) uygulamasında yeniyim. Soruma bu yazı What exactly does runtime.Gosched do? ile ilgilidir. Kodun yapısı aşağıda kopyalanmıştır. Sorum şu: GOMAXPROCS'deki işlemci sayısını değiştirdiğimde, kaç işlemcinin çalıştığını nasıl doğrularım. 'Top' yaptığımda, GOMAXPROCS 1'den fazla olduğunda bile% 100 veya daha az kaynak tüketen bir süreç gösterir. Yardımlarınız için minnettar olurum.Golang: Bir Go programının çalıştığı işlemci sayısı nasıl doğrulanır?

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

Hangi işletim sistemini üzerinde test ediyorsunuz? Ayrıca hangi CPU'yu kullandığınızı bilmek faydalı olacaktır. Davranışı yeniden oluşturamıyorum. – nemo

+0

cat/etc/* - sürüm iadeleri: Red Hat Enterprise Linux Workstation sürümü 6.3 (Santiago). İşletim sistemi linux. CPU Intel (R) Xeon (R) CPU, X5460 @ 3.16 GHz'dir. NumCPU 8 döndürür. – user984260

+0

@nemo Program mükemmel çalışır. Sadece – user984260

cevap

24

İşlemin belirli bir zamanda çalışabildiği en büyük sayıda mantıksal CPU sayısı en az runtime.GOMAXPROCS(0) ve runtime.NumCPU().

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

+1, bu doğru bir çözüm gibi görünüyor (veya en azından ilginç). Ama daha iyi ve daha dayanıklı yolların yokluğuyla ilgili bazı kaynaklarınız var mı? –

+0

Sadece bana ait olduğundan emin değilim, ancak MaxParallelism, 2011 Macbook Air ve Debian 7 çalıştıran 8 çekirdekli Intel sunucumda 0 döndürür. Benim geçici çözümüm, MBA için 4 döndüren runtime.NumCPU kullanmaktır (2 çekirdeğin her birinde 2 iş parçacığı) ve 8 Sunucuda işlemci (8 adet hyperthread çekirdeği XEON vardır). Test, Go 1.2 ile yapıldı. –

+0

@PeterKrnjevic: Bunu yeniden üretemiyorum. Macbook hava 10.9, git 1.2. –

2

Çekirdek sayısı http://golang.org/pkg/runtime/#NumCPU tarafından sorgulanabilir.

Dokümantasyonda şu yazıyor: "NumCPU, yerel makinedeki mantıksal CPU'ların sayısını döndürür."

+1

Teşekkürler. Ancak, şu anki programın çalıştığı CPU sayısını öğrenmek için sormak istedim. Bu sayı NumCPU'ya eşit veya daha küçüktür. – user984260