2012-11-05 17 views
8

Sono nuovo a Google Go (Golang). La mia domanda è correlata a questo post What exactly does runtime.Gosched do?. La struttura del codice è copiata di seguito. La mia domanda è che quando cambio il numero di processori in GOMAXPROCS, come posso verificare quanti processori è in esecuzione. Quando faccio 'top', mostra un processo a.out che consuma il 100% o meno di risorse anche quando GOMAXPROCS è superiore a 1. Sarei grato per il tuo aiuto.Golang: come verificare il numero di processori su cui è in esecuzione un programma 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

Quale SO si sta verificando questo? Inoltre sarebbe utile sapere quale CPU si usa. Non riesco a riprodurre il comportamento. – nemo

+0

cat/etc/* - restituzioni di rilascio: versione 6.3 di Red Hat Enterprise Linux Workstation (Santiago). Il sistema operativo è linux. La CPU è CPU Intel (R) Xeon (R), X5460 @ 3,16 GHz. NumCPU restituisce 8. – user984260

+0

@nemo Il programma funziona perfettamente. Solo io ero curioso di vedere il numero di processori su cui è in esecuzione – user984260

risposta

24

Il numero maggiore di CPU logiche su cui è in esecuzione il processo in un determinato momento non è superiore al minimo di runtime.GOMAXPROCS(0) e runtime.NumCPU().

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

+1 sembra una soluzione corretta (o almeno interessante). Ma hai qualche fonte sull'assenza di modi migliori e più duraturi? –

+0

Non sono sicuro che sia solo io, ma MaxParallelism restituisce 0 sul mio Macbook Air 2011 e sul server Intel a 8 core su cui è in esecuzione Debian 7. La mia soluzione è utilizzare runtime.NumCPU che restituisce 4 per MBA (2 thread su ciascuno di 2 core) e 8 CPU sul server (ha 8 XEON core non hyperthread). Test eseguito con Go 1.2. –

+0

@PeterKrnjevic: non riesco a riprodurre questo. Macbook air 10.9, vai 1.2. –

2

Il numero di core può essere richiesto da http://golang.org/pkg/runtime/#NumCPU.

La documentazione dice: "NumCPU restituisce il numero di CPU logiche sul computer locale."

+1

Grazie. Tuttavia, volevo chiedere, come sapere il numero di CPU, su cui è in esecuzione il programma corrente. Questo numero è inferiore o uguale a NumCPU. – user984260

Problemi correlati