Maison >développement back-end >Golang >Stratégie de traitement des délais d'attente du pipeline de communication de la fonction Golang
Lors de l'utilisation de pipelines pour la communication, afin d'éviter que le récepteur du pipeline soit bloqué à tout moment, Golang propose deux stratégies de traitement de délai d'attente : utilisez Context pour définir des limites de temps ou utilisez select pour écouter plusieurs pipelines lorsque le récepteur du pipeline ne reçoit pas. données, ces deux stratégies expireront toujours.
Stratégie de traitement du délai d'expiration du pipeline de communication de la fonction Golang
Le pipeline est un moyen courant de communication inter-processus dans Golang. Cependant, lorsque l’extrémité réceptrice du pipeline ne peut pas recevoir de données, elle se bloque définitivement. Pour éviter ce blocage, nous pouvons utiliser une opération de réception canalisée avec un délai d'attente.
Stratégie de traitement des délais d'attente
Il existe deux principales stratégies de traitement des délais d'attente :
Cas pratique
Ce qui suit est un exemple d'opération de réception de pipeline utilisant la stratégie de traitement de délai d'attente contextuel :
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) }
Un exemple d'opération de réception de pipeline utilisant la stratégie de traitement de délai d'attente sélectionné :
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) }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!