ホームページ  >  記事  >  バックエンド開発  >  golang 関数が goroutine と通信する方法

golang 関数が goroutine と通信する方法

PHPz
PHPzオリジナル
2024-04-26 09:36:02949ブラウズ

関数とゴルーチンは次の方法で通信できます: ミューテックス ロック: 共有リソースを保護するために使用されます 条件変数: 条件を満たすゴルーチンを通知するために使用されます チャネル: データ転送バッファ アトミック変数: ロックフリーの同時アクセス変数 実際のケース: 並列Goroutine を使用してコンピューティング集約型タスクの実行効率を向上させるタスクの処理には、具体的には、タスクの作成、Goroutine 処理タスクの開始、および処理結果の収集の 3 つのステップが含まれます。

golang 関数が goroutine と通信する方法

Go 言語における関数とゴルーチン間の通信方法

Go 言語では、関数とゴルーチンは次の通信を渡すことができます。 3 つの方法:

1. ミューテックス ロック (ミューテックス)

ミューテックス ロックは、共有リソースを保護し、同時に 1 つの Goroutine だけがリソースにアクセスできるようにするために使用されます。 。

var mu sync.Mutex // 全局互斥锁

func increment(i *int) {
    mu.Lock()
    *i++
    mu.Unlock()
}

2. 条件変数 (Cond)

条件変数は、指定された条件が満たされた場合に待機中のゴルーチンに通知するために使用されます。

var cond sync.Cond // 全局条件变量

func wait(c *sync.Cond, i *int) {
    c.L.Lock()
    for {
        if *i == 0 {
            c.Wait()
        }
        break
    }
    c.L.Unlock()
}

3. チャネル

チャネルは、ゴルーチン間でデータを送信するために使用されるバッファです。

var ch = make(chan int, 10) // 创建容量为 10 的通道

func send(c chan int, i int) {
    c <- i // 发送数据
}

func receive(c chan int) {
    v := <-c // 接收数据
}

4. アトミック変数

アトミック変数は、ロックなしで同時にアクセスできます。

var atomicInt int64

func incrementAtomic(i *int64) {
    atomicInt++
}

実用的なケース: タスクの並列処理

次に、Goroutine を使用してタスクを並列処理する実際のケースを示します。タスクを並列処理すると、特に計算量の多いタスクの場合、プログラムの実行効率が大幅に向上します。

以上がgolang 関数が goroutine と通信する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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