Maison >développement back-end >Golang >Stratégie de traitement des délais d'attente du pipeline de communication de la fonction Golang

Stratégie de traitement des délais d'attente du pipeline de communication de la fonction Golang

PHPz
PHPzoriginal
2024-05-04 12:00:021058parcourir

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 des délais dattente du pipeline de communication de la fonction Golang

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 :

  • Utilisation du contexte : À l'aide du type context.Context, nous pouvons définir un délai dans lequel aucune donnée n'est reçue et l'opération sera chronométrée. dehors.
  • Utilisez select : En utilisant l'instruction select, nous pouvons écouter plusieurs tuyaux en même temps. Lorsque le récepteur du pipeline ne reçoit pas de données, la sélection expirera.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn