「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > GO: 並行処理と並列処理 (ダミー向け)。

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

2024 年 9 月 1 日に公開
ブラウズ:688

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

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

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

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

さまざまなオーブン: 料理人はそれぞれ自分のオーブンを持っています。
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 



実際の例:

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 



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

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/ツイッター
ギットハブ

リリースステートメント この記事は次の場所に転載されています: https://dev.to/lucatonyraudales/go-concurrencia-vs-paralelismo-para-tontos-2fnn?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3