Maison > développement back-end > Golang > le corps du texte

Comment implémenter un mécanisme de délai d'attente à l'aide d'un pipeline en langage Go ?

WBOY
Libérer: 2024-06-03 15:01:58
original
1149 Les gens l'ont consulté

Utilisez un canal pour implémenter le mécanisme de délai d'attente : créez un canal. Créez une goroutine pour attendre les éléments dans le pipeline. Dans une autre goroutine, fermez le tuyau après un temps spécifié. Utilisez l'instruction select pour sélectionner l'action appropriée à effectuer lorsqu'un élément de pipeline arrive ou expire.

如何使用 Go 语言中的管道实现超时机制?

Comment utiliser des tubes pour implémenter un mécanisme de délai d'attente en langage Go

Les pipelines sont l'un des principaux mécanismes de programmation simultanée en langage Go. Les tuyaux peuvent être utilisés pour implémenter un mécanisme de délai d'attente, ce qui est utile dans les applications qui doivent chronométrer les opérations d'E/S ou d'autres tâches de longue durée.

Pour utiliser un pipeline pour implémenter un mécanisme de délai d'attente, vous devez d'abord créer un pipeline. Ceci peut être réalisé en utilisant la fonction make(chan T), où T est le type de l'élément dans le pipeline. Par exemple, pour passer un entier dans un tube, vous pouvez créer le tube comme suit : make(chan T) 函数来实现,其中 T 是管道中元素的类型。例如,要在管道中传递整数,可以通过如下方式创建管道:

ch := make(chan int)
Copier après la connexion

接下来,需要创建一个 goroutine 来等待管道中的元素。可以通过使用 go 关键字后跟管道接收表达式来实现这一点:

go func() {
    for {
        _, ok := <-ch
        if !ok {
            log.Println("Channel closed")
            break
        }
    }
}()
Copier après la connexion

在另一个 goroutine 中,可以在一定时间后关闭管道。这可以通过使用 time.After 函数来实现,该函数返回一个 time.Timer,该计时器在指定时间后会发送一个信号:

timer := time.After(3 * time.Second)
select {
    case <-timer:
        close(ch)
    case <-ch:
        fmt.Println("Received data from channel")
}
Copier après la connexion

在上面的代码中,time.After 函数会创建持续 3 秒的计时器。在计时器超时后,select 语句将关闭管道。如果管道中存在元素,则在计时器超时之前 select 语句会将其接收。

实战案例:

以下是一个使用管道来对 HTTP 请求设置超时的实战案例:

package main

import (
    "context"
    "fmt"
    "log"
    "net/http"
    "time"
)

func main() {
    // 创建 HTTP 客户端
    client := &http.Client{
        // 设置默认超时时间为 5 秒
        Timeout: 5 * time.Second,
    }

    ctx, cancel := context.WithTimeout(context.Background(), 3 * time.Second)
    defer cancel()

    // 创建管道来等待 HTTP 响应
    ch := make(chan struct{})

    // 创建 goroutine 来执行 HTTP 请求
    go func() {
        defer close(ch)

        req, err := http.NewRequest(http.MethodGet, "https://example.com", nil)
        if err != nil {
            log.Fatal(err)
        }

        // 将请求发送到使用超时上下文的客户端
        resp, err := client.Do(req.WithContext(ctx))
        if err != nil {
            log.Fatal(err)
        }
        defer resp.Body.Close()

        fmt.Println("Received HTTP response with status code:", resp.StatusCode)
    }()

    // 阻塞直到管道关闭或超时
    select {
        case <-ch:
            fmt.Println("Received data from channel")
        case <-ctx.Done():
            fmt.Println("Timeout occurred")
    }
}
Copier après la connexion

在这个示例中,我们使用 time.After 函数和管道来实现 HTTP 请求的超时。如果在 3 秒内没有收到响应,则 selectrrreee

Ensuite, vous devez créer une goroutine pour attendre les éléments dans le tube. Ceci peut être réalisé en utilisant le mot-clé go suivi de l'expression de réception du tuyau : 🎜rrreee🎜Dans une autre goroutine, le tuyau peut être fermé après un certain temps. Ceci peut être réalisé en utilisant la fonction time.After, qui renvoie un time.Timer qui envoie un signal après un temps spécifié : 🎜rrreee🎜 ci-dessus Dans le code, le La fonction time.After crée une minuterie qui dure 3 secondes. Une fois le délai expiré, l'instruction select ferme le canal. Si l'élément est présent dans le pipeline, l'instruction select le recevra avant l'expiration du délai. 🎜🎜🎜Cas pratique : 🎜🎜🎜Ce qui suit est un cas pratique d'utilisation de tubes pour définir des délais d'attente pour les requêtes HTTP : 🎜rrreee🎜Dans cet exemple, nous utilisons la fonction time.After et des tubes pour implémenter HTTP Le délai d'attente de la requête. Si aucune réponse n'est reçue dans les 3 secondes, l'instruction select imprime un message de timeout et annule le contexte, fermant ainsi le canal. 🎜

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal