通信にパイプラインを使用する場合、パイプライン レシーバーが常にブロックされるのを防ぐために、Golang は 2 つのタイムアウト処理戦略を提供します。コンテキストを使用して時間制限を設定するか、選択を使用してパイプライン レシーバーがブロックされるときに複数のパイプラインをリッスンします。データを受信しない場合、これら 2 つのすべての戦略がタイムアウトになります。
Golang 関数通信パイプラインのタイムアウト処理戦略
パイプラインは、Golang のプロセス間通信の一般的な方法です。ただし、パイプラインの受信側がデータを受信できない場合、ブロックが継続します。このブロックを防ぐために、タイムアウトを指定したパイプ受信操作を使用できます。
タイムアウト処理戦略
主なタイムアウト処理戦略は 2 つあります:
実践的なケース
次に、コンテキスト タイムアウト処理戦略を使用したパイプライン受信操作の例を示します。
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 サイトの他の関連記事を参照してください。