ホームページ >バックエンド開発 >Golang >Golang 関数の通信パイプラインのタイムアウト処理戦略

Golang 関数の通信パイプラインのタイムアウト処理戦略

PHPz
PHPzオリジナル
2024-05-04 12:00:021084ブラウズ

通信にパイプラインを使用する場合、パイプライン レシーバーが常にブロックされるのを防ぐために、Golang は 2 つのタイムアウト処理戦略を提供します。コンテキストを使用して時間制限を設定するか、選択を使用してパイプライン レシーバーがブロックされるときに複数のパイプラインをリッスンします。データを受信しない場合、これら 2 つのすべての戦略がタイムアウトになります。

Golang 関数の通信パイプラインのタイムアウト処理戦略

Golang 関数通信パイプラインのタイムアウト処理戦略

パイプラインは、Golang のプロセス間通信の一般的な方法です。ただし、パイプラインの受信側がデータを受信できない場合、ブロックが継続します。このブロックを防ぐために、タイムアウトを指定したパイプ受信操作を使用できます。

タイムアウト処理戦略

主なタイムアウト処理戦略は 2 つあります:

  • コンテキストの使用:コンテキストの使用。コンテキスト タイプでは、制限時間を設定できます。この制限時間内にデータが受信されない場合、操作はタイムアウトになります。
  • Use select: select ステートメントを使用すると、複数のパイプを同時にリッスンできます。パイプライン レシーバーがデータを受信しない場合、select はタイムアウトになります。

実践的なケース

次に、コンテキスト タイムアウト処理戦略を使用したパイプライン受信操作の例を示します。

package main

import (
    "context"
    "fmt"
    "log"
    "sync/atomic"
    "time"
)

func main() {
    // 创建一个管道
    ch := make(chan int)
    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()

    // 并发地将数据发送到管道
    go func() {
        for i := 0; i < 10; i++ {
            ch <- i
        }
    }()

    // 使用 Context 超时接收数据
    go func() {
        var total uint64
        for {
            select {
            case <-ctx.Done():
                fmt.Println("Timeout reached!")
                return
            case value := <-ch:
                total += uint64(value)
            }
        }
    }()

    log.Printf("Total: %d", total)
}

select の使用タイムアウト処理戦略 パイプ受信操作の例:

package main

import (
    "fmt"
    "log"
    "sync/atomic"
    "time"
)

func main() {
    // 创建一个管道
    ch := make(chan int)

    // 创建一个 select 语句来监听管道和超时
    var total uint64
    go func() {
        for {
            select {
            case value := <-ch:
                total += uint64(value)
            case <-time.After(5 * time.Second):
                fmt.Println("Timeout reached!")
                return
            }
        }
    }()

    // 并发地将数据发送到管道
    go func() {
        for i := 0; i < 10; i++ {
            ch <- i
        }
    }()

    log.Printf("Total: %d", total)
}

以上がGolang 関数の通信パイプラインのタイムアウト処理戦略の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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