Go で並列処理を実現するには「go f(i)」を使用するのが最適な方法でしょうか、それともチャネルやゴルーチンごとの専用ワーカーなどの代替方法を検討する必要がありますか?

DDD
リリース: 2024-11-06 04:59:02
オリジナル
364 人が閲覧しました

Is using `go f(i)` the optimal way to achieve parallelism in Go, or should we explore alternative methods like channels and dedicated workers for each goroutine?

Go での並列処理

問題:

指定された 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>
ログイン後にコピー

質問:

  1. 「dowork」関数が並列で実行されると仮定できますか?
  2. これは並列処理を実現する適切な方法ですか、それとも並列処理を実行する必要がありますか? goroutine ごとにチャネルと個別の 'dowork' ワーカーを使用しますか?

答え:

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!