ホームページ >バックエンド開発 >Golang >golang 関数と goroutine の間の相互作用のメカニズムは何ですか?

golang 関数と goroutine の間の相互作用のメカニズムは何ですか?

WBOY
WBOYオリジナル
2024-05-02 18:36:02953ブラウズ

関数は、Go 言語の次のメカニズムを通じて Goroutine と対話します。 チャネル: Goroutine 間でデータを安全に交換します。 パイプ: 外部プロセスとの通信に使用されます。

golang 関数と goroutine の間の相互作用のメカニズムは何ですか?

Go 言語における関数と Goroutine 間の対話メカニズム

Goroutine の概要

Goroutine は、Go プログラムがコードを並列実行できるようにする軽量のスレッドです。これは Go ランタイムによって管理され、手動でスレッドを作成および管理することなくタスクを並列処理するために使用されます。

関数とGoroutineのやりとり

Go言語における関数とGoroutineのやりとりは以下の仕組みで実現されます:

  • Channel: Goroutine 間でデータを安全に交換するための通信メカニズム。これは、送信者がチャネルにデータを書き込み、受信者がチャネルからデータを読み取る型付きキューです。
  • パイプ: コマンド ライン ツールまたは他の外部プロセスと通信するように設計された特別なタイプのチャネル。

実際のケース: 並列加算

関数とゴルーチンの間の相互作用を示すために、単純な並列加算プログラムを作成します。

package main

import (
    "fmt"
    "math/rand"
    "sync"
    "time"
)

const numIterations = 1000000

func main() {
    sum := 0

    // 初始化互斥锁以保护并发的 sum 变量
    lock := &sync.Mutex{}

    // 创建一个通道
    c := make(chan int)

    // 创建 Goroutine 并发计算和并将结果发送到通道
    for i := 0; i < numIterations; i++ {
        go func(num int) {
            rand.Seed(time.Now().UnixNano())
            time.Sleep(time.Duration(rand.Intn(50)) * time.Millisecond)
            lock.Lock()
            defer lock.Unlock()
            sum += num
            c <- num
        }(i)
    }

    // 从通道接收数据并打印进度条
    for i := 0; i < numIterations; i++ {
        <-c
        fmt.Printf("\rProgress: %f%", float64(i)/float64(numIterations)*100)
    }

    // 等待所有 Goroutine 完成
    time.Sleep(time.Second)

    fmt.Println("\nFinal sum:", sum)
}

このプログラムでは、 , パイプとミューテックス ロックを使用して、関数とゴルーチンの間の対話を実装します。

  • ミューテックス ロックは、同時にアクセスされる変数sumを保護し、データの整合性を確保します。
  • Goroutine は合計結果をパイプラインに送信します。
  • main 関数はパイプから結果を読み取り、進行状況バーを出力します。

このメカニズムにより、Goroutine は合計タスクを同時に実行でき、main 関数は進行状況を追跡して最終結果を収集できます。

以上がgolang 関数と goroutine の間の相互作用のメカニズムは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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