問題:
指定された 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 関数の終了の防止:
「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 中国語 Web サイトの他の関連記事を参照してください。