ホームページ > バックエンド開発 > Golang > Golang 同時実行プログラミング ガイド: 並列処理の謎を探る

Golang 同時実行プログラミング ガイド: 並列処理の謎を探る

WBOY
リリース: 2024-05-31 09:10:57
オリジナル
344 人が閲覧しました

Go の同時プログラミングでは、軽量スレッド (Goroutine) と通信メカニズム (パイプライン) を使用して、タスクの並列実行を実装します。同期プリミティブ (ミューテックスなど) は、ゴルーチン間のアクセスを調整するために使用されます。実際の例には、複数のリクエストを処理する効率的な同時 Web サービスの作成が含まれます。

Golang 同時実行プログラミング ガイド: 並列処理の謎を探る

Go での並行プログラミング ガイド: 並列処理の謎を探る

はじめに

並行プログラミングは、最新のソフトウェア開発の重要な側面であり、アプリケーションが複数のタスクを同時に実行できるようにすることで、効率とスケーラビリティを向上させます。 Go 言語は、優れた同時実行サポートにより、同時アプリケーションの構築に最適です。

Goroutine の基本

Goroutine は Go の軽量スレッドであり、go キーワードによって開始されます。これらは、同じメモリ空間を共有しますが、異なる実行ストリームで実行されるという点でスレッドとは異なります。 go关键字启动。它们与线程不同,因为它们共享相同的内存空间,但运行在不同的执行流中。

在Go中创建一个Goroutine示例代码:

package main

import "fmt"

func main() {
    go func() {
        fmt.Println("Hello from goroutine")
    }()
    fmt.Println("Hello from main")
}
ログイン後にコピー

此代码创建一个Goroutine,它并发打印Hello from goroutine,同时主Goroutine打印Hello from main

通道用于通信

管道是Goroutine之间通信的一种机制。它们类似于缓冲队列,Goroutine可以使用它们发送和接收消息。

创建一个通道的示例代码:

package main

import "fmt"

func main() {
    c := make(chan int)
    go func() { c <- 10 }()
    v := <-c
    fmt.Println(v)
}
ログイン後にコピー

此代码创建一个管道c,一个Goroutine向通道发送值10,而主Goroutine从通道接收值并打印。

同步与等待

在并发编程中,同步对于确保Goroutine之间协调执行至关重要。Go提供了各种同步原语,例如互斥体、条件变量和等待组。

使用互斥体保护共享数据示例代码:

package main

import (
    "fmt"
    "sync"
)

func main() {
    var m sync.Mutex
    var count int
    go func() {
        m.Lock()
        count++
        m.Unlock()
    }()
    m.Lock()
    fmt.Println(count)
    m.Unlock()
}
ログイン後にコピー

此代码使用互斥体m来确保只有单个Goroutine可以同时访问count

Go で Goroutine を作成する サンプルコード:

package main

import (
    "fmt"
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        go func() { fmt.Fprintf(w, "Hello, %s!", r.URL.Path[1:]) }()
    })
    log.Fatal(http.ListenAndServe(":8080", nil))
}
ログイン後にコピー
このコードは、メインの Goroutine が Hello from main を出力すると同時に Hello from goroutine を出力する Goroutine を作成します。

チャネルは通信に使用されます

パイプラインは、ゴルーチン間の通信のためのメカニズムです。これらはバッファ キューに似ており、ゴルーチンはこれを使用してメッセージを送受信できます。

チャネルを作成するサンプルコード:

rrreee

このコードはパイプ c を作成し、Goroutine が値 10 をチャネルに送信し、メインの Goroutine がその値を受信します。チャネルから取得して出力します。

同期と待機🎜🎜 同時プログラミングでは、Goroutine 間の協調的な実行を保証するために同期が重要です。 Go は、ミューテックス、条件変数、待機グループなどのさまざまな同期プリミティブを提供します。 🎜🎜ミューテックスを使用して共有データを保護するサンプル コード: 🎜rrreee🎜 このコードは、ミューテックス m を使用して、単一のゴルーチンのみが count 変数に同時にアクセスできるようにします。 🎜🎜実践例: Web サービスの同時実行処理🎜🎜 Go の同時実行機能を使用すると、複数のリクエストを同時に処理できる効率的な Web サービスを作成できます。 🎜🎜このサンプル コードは、Goroutine を使用して受信リクエストを処理する単純な Web サーバーを示しています: 🎜rrreee🎜このサーバーは、Goroutine を使用して各受信リクエストを同時に処理し、スケーラビリティと応答性を向上させます。 🎜🎜結論🎜🎜 Go の同時プログラミング機能により、開発者は高性能、応答性、スケーラブルなアプリケーションを作成できます。ゴルーチン、パ​​イプライン、同期、待機グループをマスターすることで、並列処理を最大限に活用できるようになります。 🎜

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

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