2009-11-11 3 views
8

goroutines은 여러 OS 스레드에 다중화되어 있으므로 I/O를 기다리는 동안 차단해야하는 경우 다른 스레드는 계속 실행됩니다. 그러나 n goroutines를 만들려면 얼마나 많은 스레드를 생성할지 미리 알 수있는 방법이 있습니까? 우리는 아래의 기능은 우리가 시스템 스레드 N goroutines에 대해 만들 수 얼마나 많은 (또는의 최대 수) 알 것입니다 호출하면주어진 goroutine이 생성하는 스레드의 수를 감지 할 수 있습니까?

예를 들어, : 현재

type Vector []float64 

// Apply the operation to n elements of v starting at i. 
func (v Vector) DoSome(i, n int, u Vector, c chan int) { 
    for ; i < n; i++ { 
     v[i] += u.Op(v[i]) 
    } 
    c <- 1; // signal that this piece is done 
} 
+1

지금까지 단 두 개의 관련 (험담, 비 괴짜) GO 질문 중 하나에 +1 +1 –

+1

그저 for 루프입니다. 동시성, 훨씬 적은 병렬성을 표현하지도 않습니다. – Dustin

답변

7

: 당신은 사용자 수준의 병렬 처리를 원하는 경우

... 당신은 $GOMAXPROCS을 설정하거나 runtime.GOMAXPROCS(n)를 호출해야합니다. GOMAXPROCS은 런타임 스케줄러에게 한 번에 실행될 비 -syscall 차단 된 goroutine의 수를 알려줍니다.

this blog post을 기준으로하면 환경 변수를 설정하는 것 같습니다 GOMAXPROCS 스레드 수를 수정할 수 있습니다. 그러나이 값을 지정하지 않으면 런타임에서 관리 할 기본 스레드 수를 얻는 방법을 모르겠습니다.

This blog post

당신이 환경 변수를 설정하지 않으면 런타임이 하나 개의 코어를 활용하는 것을 의미하는 것으로 보인다 (그것은 단지 하나 개의 프로세스를 사용하고 아마도 때문이다.) 각 goroutine은 하나 개의 스레드의 최대 사용할 수 있습니다

+4

수정 사항 (스펙에서 인용) : "GOMAXPROCS는 동시에 실행할 수있는 최대 CPU 수를 설정하고 이전 설정을 반환합니다." N 개의 goroutine이 N 개의 시스템 호출 (N 개의 쓰레드가 필요함)에 갇혀 있다면, Go는 항상 대기중인 goroutine을 다시 스케줄하기 위해 N + 1 번째 쓰레드를 가질 것입니다. http://code.google.com/p/go/issues/detail?id = 1644 –

3

, gccgo는 goroutine 당 하나 개의 스레드를 생성합니다 .

나는 약 6g을 모른다. 파이크의 이동 코스 PDF 슬라이드 (3 일)에 따르면

6

시각. 스레드를 사용하든 사용하지 않든 상관 없습니다. GOMAXPROCS의 값은 Go 코드를 자유롭게 실행하여 사용할 수있는 스레드 수를 결정합니다. 즉, 최대 병렬 처리 수준을 결정합니다.

그러나 더 많은 스레드는 심지어 goroutines 시스템 호출에 직접 차단하거나

다음 작업들이 차단 스레드를 사용하도록 goroutine 원인 하지을 C.를 호출 GOMAXPROCS = 1을 (를) 다음과 함께 사용할 수있다 :

  • 채널 운영
  • 네트워크 운영의 모든
  • 자고
  • 당신이 읽기에는/dev/ttyxx 블록을 열고 많은 goroutines이있는 경우 sync 패키지

이 의미에서 프리미티브는, 예를 들어, 각 하나에 대한 스레드를 사용하여있을거야. 많은 프로세스를 실행하고 프로세스가 종료 될 때까지 기다리는 경우에도 마찬가지입니다.

+0

/dev/ttyxx에 대한 차단과 관련하여 Dmitry Vyukov는 메일 링리스트에서 다음과 같이 말했습니다 : "파일/장치/장치의 처리와 같은"차단이 아닌 차단 "을 할 수없는 이유는 없습니다. 아직 Windows에서는 IOCP와 함께, 논 블로킹 네트워크와 파일 작업이 쉽습니다. 오늘날 유닉스에서 AIO의 상태는 무엇인지 확신 할 수 없습니다. " https://groups.google.com/forum/#!msg/golang-nuts/j51G7ieoKh4/wxNaKkFEfvcJ –