Golang のチャネルを介してゴルーチンを同期する方法

PHPz
リリース: 2023-08-15 08:17:06
オリジナル
1041 人が閲覧しました

Golang 中 Goroutines 之间如何通过 Channels 进行同步

チャネルを通じて Golang の Goroutine を同期する方法

Goroutine は、1 つのプログラムで複数のタスクを並行して実行できる Golang の軽量スレッドです。 Goroutine では、データ通信と同期にチャネルを使用できます。チャネルは、データの正確性と同期を確保するためのゴルーチン間の通信メカニズムを提供します。

Golang では、チャネルはゴルーチン間でデータを渡すために使用されるタイプセーフな要素です。チャネルを使用すると、ゴルーチン間の同期を実現し、データが正しい時間と順序で配信および処理されることを保証できます。

次に、Goroutine がチャネルを通じてどのように同期するかを示すサンプル コードを見てみましょう:

package main

import (
    "fmt"
    "time"
)

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)

    // 启动三个 Goroutine 执行任务
    for w := 1; w <= 3; w++ {
        go worker(w, jobs, results)
    }

    // 发送任务到 Jobs Channel
    for j := 1; j <= 5; j++ {
        jobs <- j
    }
    close(jobs)

    // 从 Results Channel 中接收结果
    for a := 1; a <= 5; a++ {
        <-results
    }

    time.Sleep(time.Second)
}
ログイン後にコピー

上の例では、2 つのチャネル: jobs を作成しました。結果###。 jobs はタスクを Goroutine に送信するために使用され、results はタスクの実行結果を受信するために使用されます。

まず、

go キーワードを使用して 3 つのゴルーチンを開始し、それぞれに必要な jobs チャネルと results チャネルを渡しました。次に、5 つのタスクをループ内で jobs チャネルに送信し、完了したら jobs チャネルを閉じます。

worker 関数では、range キーワードを使用して jobs チャネルからタスクを継続的に受信し、タスクの処理後に結果を results チャンネルに送信します。チャネルがブロックしているため、jobs チャネルからタスクを受信すると、Goroutine は停止し、次のタスクの到着を待ちます。

main 関数では、

range キーワードを使用して、results チャネルから結果を継続的に受信します。タスクの実行後、 < を渡します。 -results 式は、結果データを受け取りたいことを示しますが、実際にはこれらの値を使用しません。

最後に、main 関数では、遅延関数

time.Sleep(time.Second) を使用して、Goroutine の実行直後にプログラムが終了しないようにします。

上記のサンプル コードを通じて、チャネルを使用することでゴルーチン間の同期を実現し、データの正確さと順序を保証できることがわかります。実際のアプリケーションでは、さまざまなニーズを満たすために、必要に応じてさまざまなタイプのチャネルを作成できます。

要約すると、チャネルを介した Golang のゴルーチン間の同期は、シンプルかつ強力なメカニズムです。スレッド間の通信を提供するだけでなく、データの正確性と同期も保証し、同時プログラミングの利便性と柔軟性を提供します。

以上がGolang のチャネルを介してゴルーチンを同期する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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