ホームページ > バックエンド開発 > Golang > Golang 同時プログラミングの基礎チュートリアル: Goroutine の入門から実用的なアプリケーションまで

Golang 同時プログラミングの基礎チュートリアル: Goroutine の入門から実用的なアプリケーションまで

王林
リリース: 2023-07-18 20:34:56
オリジナル
1142 人が閲覧しました

Golang 同時プログラミングの基礎チュートリアル: Goroutine の入門から実用的なアプリケーションまで

はじめに:
インターネットの急速な発展に伴い、効率的な同時処理に対する需要も高まっています。 Golang は、高速で効率的なプログラミング言語として、その強力な同時実行サポートで人気があります。この記事では、Goroutine の入門から実践的な応用まで、Golang での並行プログラミングの基礎知識を紹介します。

1.ゴルーチンとは何ですか?
Goroutine は、他の Goroutine と同時に実行できる Golang の軽量スレッドです。ゴルーチンの作成と破棄にかかるコストは非常に低いため、数千のゴルーチンを簡単に作成して、高い同時処理を実現できます。

以下は、Goroutine を作成して実行する方法を示す簡単な例です。

package main

import (
    "fmt"
    "time"
)

func foo() {
    for i := 0; i < 5; i++ {
        fmt.Println("Goroutine:", i)
        time.Sleep(time.Millisecond * 500)
    }
}

func main() {
    go foo() // 创建并运行一个Goroutine
    for i := 0; i < 5; i++ {
        fmt.Println("Main:", i)
        time.Sleep(time.Millisecond * 500)
    }
}
ログイン後にコピー

上の例では、foo という名前の関数を作成し、main() 関数では、foo() 関数を同時に実行するためのゴルーチンが go キーワードによって作成されます。ご覧のとおり、メインスレッドと Goroutine は同時に実行され、500 ミリ秒ごとに出力されます。

2. Goroutine 間の通信
Goroutine はチャネルを通じて通信できます。チャネルは、データの同期と受け渡しに使用されるタイプです。これはキューと考えることができ、Goroutine はチャネルを通じてデータを送受信できます。

以下は、ゴルーチン間の通信にチャネルを使用する方法を示す簡単な例です:

package main

import (
    "fmt"
)

func send(c chan<- int) {
    for i := 0; i < 5; i++ {
        c <- i // 将数据发送到channel中
    }
    close(c) // 关闭channel
}

func receive(c <-chan int) {
    for num := range c { // 从channel中读取数据,直到channel被关闭
        fmt.Println("Received:", num)
    }
}

func main() {
    c := make(chan int) // 创建一个channel

    go send(c)    // 创建并运行发送Goroutine
    receive(c)    // 接收Goroutine

    fmt.Println("Main exits")
}
ログイン後にコピー

上の例では、send 関数と 受信関数。 send 関数は 0 ~ 4 の整数をチャネル経由で receive 関数に送信し、receive 関数はチャネルからデータを読み取って出力します。 main 関数では、チャネルを作成し、ゴルーチンを通じて send 関数と receive 関数を同時に実行します。データの送信と同期はチャネルを通じて実行されます。

3. Goroutine の同期と待機
実際の開発では、次のステップに進む前に、すべての Goroutine が完了するまで待つ必要がある場合があります。 Golang は、同期と Goroutine の待機を実装するための sync パッケージを提供します。

これは、sync.WaitGroup を使用してゴルーチンが完了するのを待つ方法を示す簡単な例です:

package main

import (
    "fmt"
    "sync"
    "time"
)

func foo(wg *sync.WaitGroup) {
    defer wg.Done() // 触发WaitGroup计数器减1
    for i := 0; i < 5; i++ {
        fmt.Println("Goroutine:", i)
        time.Sleep(time.Millisecond * 500)
    }
}

func main() {
    var wg sync.WaitGroup

    wg.Add(1)      // 增加WaitGroup计数器
    go foo(&wg)    // 创建并运行一个Goroutine

    wg.Wait()      // 等待所有Goroutines完成

    fmt.Println("Main exits")
}
ログイン後にコピー

上の例では、WaitGroup を作成します。 インスタンスを作成し、main() 関数にカウンターを追加します。 foo() 関数では、defer ステートメントを使用して、カウンターを 1 つデクリメントする操作をトリガーします。 WaitGroupWait() メソッドを通じて、Goroutine の完了を待ちます。これにより、後続のコードの実行を続ける前に、すべてのゴルーチンが確実に実行されます。

結論:
この記事の導入部を通じて、私たちは Golang での同時プログラミングの基本を学びました。 Goroutine の作成と実行から、Goroutine 間の通信のためのチャネルの使用、Goroutine の同期と待機を実現するための sync.WaitGroup の使用まで、Golang の同時プログラミング機能をより適切に適用して、プログラムのパフォーマンスと効率。

Golang の同時プログラミングをさらに習得することを学ぶことで、同時実行性の高いインターネット アプリケーションの開発に大いに役立つと思います。実際に調査を続け、それを実際の開発に適用して、ユーザーにとってより良いアプリケーション エクスペリエンスを作成してみましょう。

以上がGolang 同時プログラミングの基礎チュートリアル: Goroutine の入門から実用的なアプリケーションまでの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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