통신을 위해 파이프라인을 사용할 때 파이프라인 수신기가 항상 차단되는 것을 방지하기 위해 Golang은 두 가지 시간 초과 처리 전략을 제공합니다. 즉, 파이프라인 수신기가 수신하지 않을 때 Context를 사용하여 시간 제한을 설정하거나 선택을 사용하여 수신합니다. 데이터에 따르면 이 두 가지 전략은 모두 시간 초과됩니다.
Golang 함수 통신 파이프라인 시간 초과 처리 전략
Pipeline은 Golang에서 프로세스 간 통신을 위한 일반적인 방법입니다. 그러나 파이프라인의 수신 측이 데이터를 수신할 수 없으면 계속 차단됩니다. 이러한 차단을 방지하기 위해 시간 제한이 있는 파이프된 수신 작업을 사용할 수 있습니다.
타임아웃 처리 전략
두 가지 주요 타임아웃 처리 전략이 있습니다:
실용 사례
다음은 Context Timeout 처리 전략을 사용한 파이프라인 수신 작업의 예입니다.
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 Timeout 처리 전략을 사용한 파이프라인 수신 작업의 예:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!