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

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

Jan 20, 2024 am 09:08 AM
golang 同時プログラミング 標準ライブラリ

同時プログラミング ガイド: 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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Golang を使用してファイルを安全に読み書きするにはどうすればよいですか? Golang を使用してファイルを安全に読み書きするにはどうすればよいですか? Jun 06, 2024 pm 05:14 PM

Go ではファイルを安全に読み書きすることが重要です。ガイドラインには以下が含まれます。 ファイル権限の確認 遅延を使用してファイルを閉じる ファイル パスの検証 コンテキスト タイムアウトの使用 これらのガイドラインに従うことで、データのセキュリティとアプリケーションの堅牢性が確保されます。

一般的にC言語で使用される合計は何ですか? 一般的にC言語で使用される合計は何ですか? Apr 03, 2025 pm 02:39 PM

C言語標準ライブラリに「sum」という名前の関数はありません。 「合計」は通常、プログラマーによって定義されるか、特定のライブラリで提供され、その機能は特定の実装に依存します。一般的なシナリオは配列の合計であり、リンクリストなどの他のデータ構造でも使用できます。さらに、「sum」は、画像処理や統計分析などのフィールドでも使用されます。優れた「合計」関数は、優れた読みやすさ、堅牢性、効率を持つ必要があります。

マルチスレッドをC言語で実装する4つの方法 マルチスレッドをC言語で実装する4つの方法 Apr 03, 2025 pm 03:00 PM

言語のマルチスレッドは、プログラムの効率を大幅に改善できます。 C言語でマルチスレッドを実装する4つの主な方法があります。独立したプロセスを作成します。独立して実行される複数のプロセスを作成します。各プロセスには独自のメモリスペースがあります。擬似マルチスレッド:同じメモリ空間を共有して交互に実行するプロセスで複数の実行ストリームを作成します。マルチスレッドライブラリ:pthreadsなどのマルチスレッドライブラリを使用して、スレッドを作成および管理し、リッチスレッド操作機能を提供します。 Coroutine:タスクを小さなサブタスクに分割し、順番に実行する軽量のマルチスレッド実装。

フロントエンドからバックエンドの開発に変身すると、JavaやGolangを学ぶことはより有望ですか? フロントエンドからバックエンドの開発に変身すると、JavaやGolangを学ぶことはより有望ですか? Apr 02, 2025 am 09:12 AM

バックエンド学習パス:フロントエンドからバックエンドへの探査の旅は、フロントエンド開発から変わるバックエンド初心者として、すでにNodeJSの基盤を持っています...

Golang で事前定義されたタイムゾーンを使用するにはどうすればよいですか? Golang で事前定義されたタイムゾーンを使用するにはどうすればよいですか? Jun 06, 2024 pm 01:02 PM

Go 言語で事前定義されたタイムゾーンを使用するには、次の手順が必要です。 「time」パッケージをインポートします。 LoadLocation 関数を使用して特定のタイム ゾーンを読み込みます。読み込まれたタイムゾーンは、Time オブジェクトの作成、時刻文字列の解析、日付と時刻の変換の実行などの操作で使用します。事前定義されたタイム ゾーン機能の適用を説明するために、異なるタイム ゾーンを使用して日付を比較します。

Golangの目的:効率的でスケーラブルなシステムの構築 Golangの目的:効率的でスケーラブルなシステムの構築 Apr 09, 2025 pm 05:17 PM

GO言語は、効率的でスケーラブルなシステムの構築においてうまく機能します。その利点には次のものがあります。1。高性能:マシンコードにコンパイルされ、速度速度が速い。 2。同時プログラミング:ゴルチンとチャネルを介してマルチタスクを簡素化します。 3。シンプルさ:簡潔な構文、学習コストとメンテナンスコストの削減。 4。クロスプラットフォーム:クロスプラットフォームのコンパイル、簡単な展開をサポートします。

GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? Apr 02, 2025 pm 04:12 PM

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

個別の関数使用距離関数C使用チュートリアル 個別の関数使用距離関数C使用チュートリアル Apr 03, 2025 pm 10:27 PM

std :: uniqueは、コンテナ内の隣接する複製要素を削除し、最後まで動かし、最初の複製要素を指すイテレーターを返します。 STD ::距離は、2つの反復器間の距離、つまり、指す要素の数を計算します。これらの2つの機能は、コードを最適化して効率を改善するのに役立ちますが、隣接する複製要素をstd ::のみ取引するというような、注意すべき落とし穴もあります。 STD ::非ランダムアクセスイテレーターを扱う場合、距離は効率が低くなります。これらの機能とベストプラクティスを習得することにより、これら2つの機能の力を完全に活用できます。

See all articles