문제:
주어진 Go 코드 조각을 고려하세요.
<code class="go">package main import ( "fmt" "math/rand" "time" ) func main() { for i := 0; i < 3; i++ { go f(i) } // prevent main from exiting immediately var input string fmt.Scanln(&input) } func f(n int) { for i := 0; i < 10; i++ { dowork(n, i) amt := time.Duration(rand.Intn(250)) time.Sleep(time.Millisecond * amt) } } func dowork(goroutine, loopindex int) { // simulate work time.Sleep(time.Second * time.Duration(5)) fmt.Printf("gr[%d]: i=%d\n", goroutine, loopindex) }</code>
질문:
답변:
GOMAXPROCS 관련:
Go 1.5 릴리스 노트에 따르면:
"기본적으로 Go 프로그램은 사용 가능한 코어 수로 설정된 GOMAXPROCS로 실행됩니다. 이전 릴리스에서는 기본값이 1이었습니다."
주요 기능 종료 방지:
'main' 기능이 즉시 종료되는 것을 방지하려면 'WaitGroup' 유형, 특히 'Wait' 기능을 활용할 수 있습니다.
병렬 처리 관련:
기능 그룹의 병렬 처리를 용이하게 하기 위해 도우미 기능을 사용할 수 있습니다.
<code class="go">import "sync" // Parallelize executes functions concurrently func Parallelize(functions ...func()) { var waitGroup sync.WaitGroup waitGroup.Add(len(functions)) defer waitGroup.Wait() for _, function := range functions { go func(f func()) { defer waitGroup.Done() f() }(function) } }</code>
귀하의 경우 병렬 처리는 다음과 같이 달성할 수 있습니다.
<code class="go">func1 := func() { f(0) } func2 = func() { f(1) } func3 = func() { f(2) } Parallelize(func1, func2, func3)</code>
위 내용은 Go에서 병렬성을 달성하는 최적의 방법은 'go f(i)'를 사용하는 것입니까, 아니면 각 고루틴에 대한 채널 및 전용 작업자와 같은 대체 방법을 찾아야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!