Heim >Backend-Entwicklung >Golang >Timeout-Verarbeitungsstrategie für die Kommunikationspipeline der Golang-Funktion
Um zu verhindern, dass der Pipeline-Empfänger ständig blockiert wird, bietet Golang bei der Verwendung von Pipelines zwei Timeout-Verarbeitungsstrategien: Verwenden Sie Kontext, um Zeitlimits festzulegen, oder verwenden Sie Select, um mehrere Pipelines abzuhören, wenn der Pipeline-Empfänger nicht empfängt Daten werden diese beiden Strategien alle ablaufen.
Strategie zur Timeout-Verarbeitung der Golang-Funktionskommunikationspipeline
Pipeline ist eine gängige Methode der prozessübergreifenden Kommunikation in Golang. Wenn das empfangende Ende der Pipeline jedoch keine Daten empfangen kann, wird sie für immer blockiert. Um diese Blockierung zu verhindern, können wir einen weitergeleiteten Empfangsvorgang mit einer Zeitüberschreitung verwenden.
Timeout-Verarbeitungsstrategie
Es gibt zwei Hauptstrategien für die Timeout-Verarbeitung:
Praktischer Fall
Das Folgende ist ein Beispiel für einen Pipeline-Empfangsvorgang unter Verwendung der Kontext-Timeout-Verarbeitungsstrategie:
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) }
Ein Beispiel für einen Pipeline-Empfangsvorgang unter Verwendung der ausgewählten Timeout-Verarbeitungsstrategie:
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) }
Das obige ist der detaillierte Inhalt vonTimeout-Verarbeitungsstrategie für die Kommunikationspipeline der Golang-Funktion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!