ホームページ  >  記事  >  バックエンド開発  >  同時プログラミング ガイド: Golang 標準ライブラリでの並列処理の探索

同時プログラミング ガイド: Golang 標準ライブラリでの並列処理の探索

WBOY
WBOYオリジナル
2024-01-20 09:08:121155ブラウズ

同時プログラミング ガイド: Golang 標準ライブラリでの並列処理の探索

Golang 標準ライブラリの並行プログラミング ガイド

はじめに:
並行プログラミングは、プログラムのパフォーマンスの問題を解決し、コンピューティング リソースの効率的な使用を実現する重要な手段です。 Golang プログラミング言語では、豊富な同時プログラミング ツールとメソッドが提供されています。この記事では、Golang 標準ライブラリの一般的な並行プログラミング手法をいくつか紹介し、具体的なコード例を通してその使用法と注意事項を説明します。

  1. Goroutine (コルーチン)
    Goroutine は Go キーワードで開始される Golang の軽量スレッドです。 Goroutine を使用すると、プログラム内で複数のタスクを同時に実行し、高い同時実行効果を実現できます。以下は簡単な Goroutine の例です。
package main

import (
    "fmt"
    "time"
)

func printNumbers() {
    for i := 0; i < 5; i++ {
        fmt.Printf("%d ", i)
        time.Sleep(time.Millisecond * 500)
    }
}

func printLetters() {
    for i := 'A'; i < 'F'; i++ {
        fmt.Printf("%c ", i)
        time.Sleep(time.Millisecond * 500)
    }
}

func main() {
    go printNumbers()    // 启动一个Goroutine,打印数字
    go printLetters()    // 启动另一个Goroutine,打印字母

    time.Sleep(time.Second * 3)    // 等待两个Goroutine执行完毕
    fmt.Println("Done")
}

上記のコードでは、2 つの関数 printNumbersprintLetters をそれぞれ定義し、## The # go キーワードは、それぞれ 2 つのゴルーチンとして開始します。 time.Sleep 関数を使用して 2 つのゴルーチンの実行が完了するのを待つと、出力結果に数字と文字が交互に出力されることがわかります。

    Channel (チャネル)
  1. Golang ではゴルーチン間の通信は Channel (チャネル) を使って完結します。 Channel は、Goroutine 間でデータを受け渡すために使用されるタイプセーフなキューです。以下は簡単なチャネルの例です。
  2. package main
    
    import (
        "fmt"
        "time"
    )
    
    func worker(id int, jobs <-chan int, results chan<- int) {
        for job := range jobs {
            fmt.Printf("Worker %d started job %d
    ", id, job)
            time.Sleep(time.Second)
            fmt.Printf("Worker %d finished job %d
    ", id, job)
            results <- job * 2
        }
    }
    
    func main() {
        numJobs := 5
        jobs := make(chan int, numJobs)
        results := make(chan int, numJobs)
    
        numWorkers := 3
        for w := 1; w <= numWorkers; w++ {
            go worker(w, jobs, results)
        }
    
        for j := 1; j <= numJobs; j++ {
            jobs <- j
        }
        close(jobs)
    
        for a := 1; a <= numJobs; a++ {
            result := <-results
            fmt.Println("Result:", result)
        }
    }
上記のコードでは、ジョブ チャネルによって渡された数値を受け取り、実行するために使用される

worker 関数を定義します。対応する処理に応じて、結果が結果チャネルを通じて返されます。 main 関数では、ジョブと結果という 2 つのチャネルをそれぞれ作成し、実行のためにジョブ チャネルを 3 つのゴルーチンに渡しました。次に、for ループを通じて 5 つのジョブをジョブ チャネルに送信し、チャネルを閉じます。最後に、結果チャネルの戻り結果が for ループを通じて受信され、出力されます。

    WaitGroup (待機グループ)
  1. 同時プログラミングでは、多くの場合、次のステップに進む前に、複数の Goroutine のすべての実行が完了するまで待つ必要があります。 Golang の
    sync パッケージは、この関数を実装するための WaitGroup タイプを提供します。以下は、WaitGroup の使用例です。
  2. package main
    
    import (
        "fmt"
        "sync"
        "time"
    )
    
    func worker(id int, wg *sync.WaitGroup) {
        defer wg.Done()
        fmt.Printf("Worker %d starting
    ", id)
        time.Sleep(time.Second)
        fmt.Printf("Worker %d done
    ", id)
    }
    
    func main() {
        var wg sync.WaitGroup
    
        numWorkers := 3
        wg.Add(numWorkers)
        for w := 1; w <= numWorkers; w++ {
            go worker(w, &wg)
        }
    
        wg.Wait()
        fmt.Println("All workers done")
    }
上記のコードでは、

worker 関数を定義します。この関数は、WaitGroup パラメーターを受け取り、対応するタスクを実行し、タスクの実行が完了すると、Done メソッドを通じて WaitGroup に通知されます。 main 関数では、WaitGroup 変数を作成し、Add メソッドを通じて待機するゴルーチンの数を指定します。次に、go キーワードを使用して、対応する数のゴルーチンを開始し、WaitGroup ポインターを各ゴルーチンに渡します。最後に、Wait メソッドを通じてすべての Goroutine の実行が完了するまで待ちます。

概要:

Golang 標準ライブラリで提供される同時プログラミング ツールとメソッドを使用すると、同時実行性の高いプログラムを簡単に実装できます。この記事では、Goroutine、Channel、WaitGroup などの一般的な同時プログラミング手法を紹介し、具体的なコード例で説明します。この記事を学習することで、読者が Golang の同時プログラミング スキルをよりよく習得し、プログラムのパフォーマンスと操作効率を向上できることを願っています。

以上が同時プログラミング ガイド: Golang 標準ライブラリでの並列処理の探索の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。