2012-11-05 2 views
8

Google Go (Golang)를 처음 사용했습니다. 제 질문은이 게시물 What exactly does runtime.Gosched do?과 관련이 있습니다. 코드의 구조는 다음과 같습니다. 내 질문은 GOMAXPROCS의 프로세서 수를 변경할 때 실행중인 프로세서의 수를 어떻게 확인할 수 있습니까? "top"을 선택하면 GOMAXPROCS가 1보다 클 때도 100 % 이하의 리소스를 소비하는 a.out 프로세스가 표시됩니다. 귀하의 도움에 감사드립니다.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

테스트 할 OS는 무엇입니까? 또한 사용하는 CPU를 아는 것이 도움이됩니다. 나는 그 행동을 재현 할 수 없다. – nemo

+0

cat/etc/* - release는 Red Hat Enterprise Linux 워크 스테이션 릴리스 6.3 (산티아고)을 반환합니다. OS는 리눅스입니다. 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 코어 Intel 서버에서 0을 반환합니다. 해결 방법은 runtime.NumCPU를 사용하여 MBA (각 코어 2 개에 2 개의 스레드)를 반환하고 서버에 8 CPU (하이퍼 쓰레드 코어 XEON이 8 개 없음). Go 1.2로 테스트가 완료되었습니다. –

+0

@PeterKrnjevic : 이것을 재현 할 수 없습니다. 맥북 에어 10.9, 1.2 이동하십시오. –

2

코어 수는 http://golang.org/pkg/runtime/#NumCPU로 문의 할 수 있습니다.

설명서에 "NumCPU가 로컬 컴퓨터의 논리 CPU 수를 반환합니다."

+1

감사합니다. 그러나 현재 진행중인 프로그램이 실행중인 CPU 수를 파악하는 방법을 묻고 싶습니다. 이 숫자는 NumCPU보다 작거나 같습니다. – user984260

관련 문제