주어진 수의 Goroutines가 생성 할 스레드 수를 감지 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1714136

  •  19-09-2019
  •  | 
  •  

문제

Goroutines가 여러 OS 스레드에 다중화되어 있음을 이해하므로 I/O를 기다리는 동안 차단 해야하는 경우 다른 사람들은 계속 실행됩니다. 그러나 N Goroutines를 만들려면 얼마나 많은 스레드를 생성 할 것인지 미리 알 수있는 방법이 있습니까?

예를 들어 아래 기능을 호출하면 N Goroutines에 대해 얼마나 많은 (또는 최대 수의 시스템 스레드가 생성 될 것인지 알 수 있습니다.

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
}
도움이 되었습니까?

해결책

Pike 's Go Course PDF 슬라이드 (3 일)에 따르면 :

... 사용자 수준 병렬 처리를 원한다면 설정해야합니다 $GOMAXPROCS 또는 전화 runtime.GOMAXPROCS(n). GOMAXPROCS 런타임 스케줄러에게 한 번에 실행할 수없는 비시 콜 블로킹 된 고어 라인의 수를 알려줍니다.

기반 이 블로그 게시물, 또한 환경 변수를 설정하는 것 같습니다. GOMAXPROCS 스레드 수를 수정할 수 있습니다. 그러나이 값을 지정하지 않으면 런타임이 관리하는 기본 스레드 번호를 얻는 방법을 잘 모르겠습니다.

이 블로그 게시물 환경 변수를 설정하지 않으면 런타임은 하나의 코어 만 사용한다는 것을 암시합니다 (아마도 하나의 프로세스 만 사용하기 때문에).

다른 팁

각 Goroutine은 한 번에 최대 한 스레드를 사용할 수 있습니다. 그것이 스레드를 사용하는지 여부는 무엇을하고 있는지에 따라 다릅니다. GomaxProcs의 값은 Go 코드를 자유롭게 실행하여 사용할 수있는 스레드 수를 결정합니다.

그러나 Goroutines가 시스템 호출 또는 호출에 직접 차단할 때 GomaxProcs = 1에서도 더 많은 스레드를 사용할 수 있습니다.

다음 작업이 있습니다 ~ 아니다 고르 루틴이 차단할 때 스레드를 사용하게됩니다.

  • 채널 작업
  • 네트워크 운영
  • 자고 있는
  • 모든 프리미티브 동조 패키지

예를 들어, 읽기 /dev /ttyxx를 열고 차단하는 많은 고루틴이있는 경우 각각의 스레드에 스레드를 사용한다는 것을 의미합니다. 많은 프로세스를 실행하고 종료되기를 기다리는 경우에도 마찬가지입니다.

현재 GCCGO는 Goroutine 당 하나의 스레드를 생성합니다.

나는 6G에 대해 모른다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top