ホームページ  >  記事  >  バックエンド開発  >  GO: 並行処理と並列処理 (ダミー向け)。

GO: 並行処理と並列処理 (ダミー向け)。

WBOY
WBOYオリジナル
2024-08-23 12:30:31628ブラウズ

やや品位を下げるタイトルのこの投稿へようこそ。
しかし、この投稿では、私のお気に入りのプログラミング言語 GOLANG を使用して、プログラミングのこれら 2 つの特徴が何であるかを非常に簡単に説明したいと思います。

キッチンを想像してみましょう:

料理を作る: これはタスクを表します。
料理人: 彼は加工業者です。
出席:

キッチンには数人の料理人: それぞれが異なる料理を準備しています。
In Go: すべてのクックはゴルーチンになります。キッチン (加工業者) にはオーブンが 1 つしかありませんが、料理人は同時に料理を作り、オーブンが空くまで他の作業に時間を費やすことができます。
並列処理:

さまざまなオーブン: 各料理人は自分のオーブンを持っています。
In Go: 複数の物理プロセッサがある場合、各 goroutine は異なるプロセッサ上で実行され、実際の方法で同時に複数の料理を調理できます。

違いは何ですか?

同時実行性: タスクは絡み合って実行され、単一のプロセッサ上でも並列処理のように見せかけます。
並列処理: タスクは複数のプロセッサ上で同時に実行され、プロセスが大幅に高速化されます。

Go での使用方法

ゴルーチン: 軽いスレッドのようなものです。 goroutine を作成するには、関数の前に go キーワードを使用するだけです。

GO: Concurrencia vs Paralelismo Para Tontos.

Golang でゴルーチンを使用する方法の例を見てみましょう:

go func() {
    // Código que se ejecutará en una goroutine
}()

チャネル: これらは、ゴルーチンが通信および同期できるパイプです。
料理人の間で材料を渡すための管だと想像してください

ch := make(chan int)
go func() {
    ch <- 42 // Enviar un valor por el canal
}()
value := <-ch // Recibir un valor del canal

実際的な例:

package main

import (
    "fmt"
    "time"
)

func worker(id int, c chan int) {
    for n := range c {
        fmt.Printf("Worker %d received %d\n", id, n)
        time.Sleep(time.Second)
    }
}

func main() {
    c := make(chan int)

    for i := 1; i <= 5; i++ {
        go worker(i, c)
    }

    for n := 1; n <= 10; n++ {
        c <- n
    }
    close(c)

    time.Sleep(time.Second)
}

このコードの出力は次のようになります

Worker 1 received 1
Worker 2 received 2
Worker 3 received 3
Worker 4 received 4
Worker 5 received 5
Worker 1 received 6
Worker 2 received 7
Worker 3 received 8
Worker 4 received 9
Worker 5 received 10

ただし、このように見える場合もあります

Worker 5 received 1
Worker 1 received 3
Worker 2 received 2
Worker 4 received 5
Worker 3 received 4
Worker 3 received 6
Worker 5 received 10
Worker 2 received 8
Worker 4 received 7
Worker 1 received 9

またはこのように

Worker 5 received 1
Worker 1 received 2
Worker 2 received 3
Worker 3 received 4
Worker 4 received 5
Worker 1 received 6
Worker 2 received 7
Worker 3 received 8
Worker 5 received 9
Worker 4 received 10

プログラムを実行するたびに出力が変わるのはなぜですか?

プログラムの出力が実行のたびに変化する主な理由は、同時実行の非決定的な性質によるものです。

何が起こっているかの内訳は次のとおりです:

チャネルの作成: make(chan int) は整数のチャネルを作成します。このチャネルはゴルーチン間の通信に使用されます。

ゴルーチンの開始: i := 1; のループi ワーカー関数は ID とチャネルを受け取ります。

チャネルに値を送信: n := 1; のループn 1 から 10 までの値をチャネルに送信します。

チャネルを閉じる: close(c) 呼び出しはチャネルを閉じ、これ以上値が送信されないことを示します。

チャネルから値を受信: 各ゴルーチンは、for n := range c ループを使用してチャネルから値を受信します。値を受信すると、その値がコンソールに出力されます。

ゴルーチンの終了を待つ: time.Sleep(time.Second) 呼び出しにより、メインのゴルーチンは終了する前に他のゴルーチンが終了するのを待機します。

これまで:

チャネルを通じて数値を受け取る 5 つのゴルーチン (クック) を作成しました。
クックが処理できるように番号をチャネルに送信します。
料理人は同時に作業し、数値を受け取るたびに処理します。

Go で同時実行性と並列処理を使用する理由

パフォーマンスの向上: 特に I/O バウンドのタスク (ファイルの読み取りや HTTP リクエストの作成など)。
応答性の向上: アプリケーションは、タスクがロックされている間も他のリクエストに応答し続けることができます。
よりスケーラブルなアーキテクチャ: 複数のコアまたはマシンに作業を分散できます。

覚えておいてください!

同時実行と並列処理は強力なツールですが、コードの理解とデバッグがより複雑になる可能性もあります。これらを注意深く使用し、その意味を理解することが重要です。

特定のトピックについてさらに詳しく知りたいですか?

次のような概念を検討できます。

同期: ミューテックス、ワークグループなど
同時実行パターン: プロデューサー/コンシューマー、パイプラインなど
同時テスト: 同時コードを効果的にテストする方法

こんにちは、
ルカトニー・ラウダレス

X/ツイッター
ギットハブ

以上がGO: 並行処理と並列処理 (ダミー向け)。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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