ホームページ > バックエンド開発 > Golang > golangの並列記述方法とは何ですか?

golangの並列記述方法とは何ですか?

PHPz
リリース: 2023-04-11 10:14:53
オリジナル
599 人が閲覧しました

現代のソフトウェア開発では、コンピューターのハードウェア リソースを効率的に使用することが重要です。並列プログラミングは、マルチコア CPU を最大限に活用できるプログラミング方法です。他のプログラミング言語と比較して、Go 言語 (Golang とも呼ばれる) には同時プログラミングをサポートするツールとメカニズムが組み込まれているため、並列プログラミングの分野で広く使用され、認識されています。

この記事では、Golang で並列プログラミングを実装するためのいくつかの方法と技術、および適用可能なシナリオと注意事項を紹介します。

1. Goroutine とチャネル

Goroutine は、Golang が他のプログラミング言語から借用した並列プログラミング モデルです。これは軽量スレッドと呼ばれ、コンピューターのマルチコア処理能力をより効率的に利用します。各 Goroutine は Golang のランタイム システムによって自動的に管理され、開発者は go キーワードを実行して Goroutine を作成するだけで済みます。

例:

func main() {
    go func() {
        fmt.Println("Hello, Goroutine!")
    }()
    fmt.Println("Hello, World!")
}
ログイン後にコピー

このコードでは、匿名関数を作成し、go キーワードを使用してそれを Goroutine に変換します。プログラムは「Hello, World!」と「Hello, Goroutine!」を同時に出力します。

チャネルは、Golang のゴルーチン間の通信に使用されるメカニズムです。チャネルはあらゆる種類のデータの送信に使用できるため、異なるゴルーチン間でデータと制御情報を渡すことができます。

例:

func worker(id int, jobs <-chan int, results chan<- int) {
    for j := range jobs {
        fmt.Println("worker", id, "started  job", j)
        time.Sleep(time.Second)
        fmt.Println("worker", id, "finished job", j)
        results <- j * 2
    }
}

func main() {
    jobs := make(chan int, 100)
    results := make(chan int, 100)
    for w := 1; w <= 3; w++ {
        go worker(w, jobs, results)
    }
    for j := 1; j <= 9; j++ {
        jobs <- j
    }
    close(jobs)
    for a := 1; a <= 9; a++ {
        <-results
    }
}
ログイン後にコピー

このコードでは、タスクを受信するチャネルとタスクの結果を返すチャネルの 2 つのチャネルを受け取るワーカー関数を定義します。 3つのゴルーチンを作成しましたが、それぞれのゴルーチンはジョブチャネルからタスクを取得し、処理結果を結果チャネルに書き込みます。最後に、for ループを使用して 9 つのタスクをジョブ チャネルに送信し、結果チャネルの値を標準出力に出力します。ワーカー関数を終了するには、for ループの後にジョブ チャネルを閉じる必要があることに注意してください。

2. 同期パッケージ

Golang では、同期パッケージは、次のような並列プログラミングに必要ないくつかの同期ツールを提供します:

· WaitGroup: Goroutine のグループが実行されるのを待ちます。タスクを完了する ;
· Mutex: 共有データへの相互排他的アクセスを実装します;
· Cond: 条件変数、複数の Goroutine 間で通信および同期します。

ここでは、WaitGroup の使用例を示します。

func worker(id int, wg *sync.WaitGroup) {
    defer wg.Done()
    fmt.Printf("Worker %d starting\n", id)

    time.Sleep(time.Second)
    fmt.Printf("Worker %d done\n", id)
}

func main() {
    var wg sync.WaitGroup

    for i := 1; i <= 5; i++ {
        wg.Add(1)
        go worker(i, &wg)
    }

    wg.Wait()
}
ログイン後にコピー

この例では、WaitGroup ポインターをパラメーターとして受け取るワーカー関数を定義します。関数の作業が完了したら、WaitGroup の Done メソッドを呼び出して、それが属する Goroutine タスクが完了したことを通知します。 main 関数では、ワーカー関数ごとに Goroutine を作成し、WaitGroup の Add メソッドを使用して、ここで実行されている Goroutine のグループがあることを WaitGroup に伝えます。最後に、Wait メソッドを呼び出して、すべてのゴルーチンがタスクを完了するのを待ちます。

3. GOMAXPROCS を設定する

Golang では、GOMAXPROCS は同時に実行する Goroutine の数を示す数値です。この数値の設定が小さすぎると、プログラムの並列処理が制限されます。設定が大きすぎると、コンピュータのリソースが無駄に消費されます。したがって、コンピューターのリソースの過剰な使用または過少使用を避けるために、コンピューターのプロセッサ コアの数に応じて GOMAXPROCS の値を設定する必要があります。

デフォルトでは、Golang の GOMAXPROCS はプロセッサ コアの数と同じです。ランタイム パッケージを使用してプログラム コード内で変更できます:

import "runtime"

//...

func main() {
    numCPU := runtime.NumCPU()
    runtime.GOMAXPROCS(numCPU)

    //...
}
ログイン後にコピー

ここでは、ランタイム パッケージを使用して次の値を取得します。プロセッサ コアの数を確認し、GOMAXPROCS の値をコアの数と同じに設定します。

概要

この記事では、Goroutine と Channel、Sync パッケージ、GOMAXPROCS の設定など、Golang での同時プログラミングのいくつかの方法とテクノロジを紹介します。同時プログラミングはプログラムのパフォーマンスと効率を向上させることができますが、いくつかのリスクと課題ももたらします。したがって、並行プログラミングを実行するときは、実際の状況に基づいて適切なソリューションを選択し、不要なエラーやリソースの無駄を避けるために並列度の制御に注意を払う必要があります。

以上がgolangの並列記述方法とは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート