golang 関数は goroutine とどのように相互作用するのでしょうか?

WBOY
リリース: 2024-05-04 12:24:02
オリジナル
586 人が閲覧しました

Go 関数は、チャネル、待機グループまたはチャネル制御実行フロー、ミューテックスまたはチャネル同期タスクを通じてデータを渡すことによって、Goroutine と対話します。 データの受け渡し: チャネルを FIFO キューとして使用して、関数からコルーチンに値を送受信します。実行フローを制御します。待機グループを使用してコルーチンの実行が完了するまで待機するか、チャネルを使用してコルーチンに特定の操作を実行するように通知します。同期タスク: ミューテックスまたはチャネルを使用して、同時にアクセスされるリソースを同期し、一度に 1 つのコルーチンのみがリソースにアクセスできるようにします。

golang 関数は goroutine とどのように相互作用するのでしょうか?

#Go 関数はどのように Goroutine と対話するのでしょうか?

Go では、Goroutine は同時に実行される軽量のスレッドです。これにより、コードを並列実行できるようになり、アプリケーションのパフォーマンスが向上します。関数はコルーチンと対話して、実行フローの制御、データの受け渡し、タスクの同期を行うことができます。

データの受け渡し

データは、チャネルを通じて関数からコルーチンに渡すことができます。チャネルは、コルーチンが関数から値を送受信できるようにする FIFO (先入れ先出し) キューです。次の例は、チャネルの使用方法を示しています。

package main

import "fmt"

func sendData(ch chan<- int) {
    for i := 0; i < 10; i++ {
        ch <- i
    }
    close(ch)
}

func receiveData(ch <-chan int) {
    for {
        data, ok := <-ch
        if !ok {
            return
        }
        fmt.Println("Received:", data)
    }
}

func main() {
    ch := make(chan int)
    go sendData(ch)
    receiveData(ch)
}
ログイン後にコピー

実行フローの制御

待機グループまたはチャネルを使用して、コルーチンの実行フローを制御できます。待機グループを使用すると、すべてのコルーチンの実行が完了するまで待機できます。一方、チャネルを使用して、コルーチンに特定のアクションを実行するように通知できます。次の例は、待機グループの使用方法を示しています。

package main

import (
    "fmt"
    "sync"
)

var wg sync.WaitGroup

func task(i int) {
    fmt.Println("Task", i)
    wg.Done()
}

func main() {
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go task(i)
    }
    wg.Wait()
}
ログイン後にコピー

同期タスク

同時にアクセスされるリソースは、ミューテックスまたはチャネルを通じて同期できます。ミューテックス ミューテックスを使用すると、一度に 1 つのコルーチンがリソースにアクセスできます。チャネルを使用すると、リソースが利用可能になるまでコルーチンをブロックできます。次の例は、ミューテックスの使用方法を示しています:

package main

import (
    "fmt"
    "sync"
)

var mutex sync.Mutex

func task(data string) {
    mutex.Lock()
    fmt.Println(data)
    mutex.Unlock()
}

func main() {
    for i := 0; i < 10; i++ {
        go task(fmt.Sprintf("Task %d", i))
    }
}
ログイン後にコピー

以上がgolang 関数は goroutine とどのように相互作用するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!