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

Résoudre l'erreur Golang : goroutine a dépassé le délai d'attente, étapes de solution détaillées

PHPz
Libérer: 2023-08-18 22:29:03
original
1044 Les gens l'ont consulté

解决golang报错:goroutine exceeded timeout,详细解决步骤

Solution à l'erreur golang : goroutine a dépassé le délai d'attente, étapes de solution détaillées

Introduction :
Lors de l'utilisation de golang pour la programmation simultanée, des problèmes de délai d'attente goroutine sont souvent rencontrés. Cet article expliquera en détail comment résoudre ce problème et donnera des exemples de code correspondants.

Contexte du problème :
Dans Golang, l'utilisation de goroutine peut facilement implémenter une programmation simultanée. Cependant, parfois, lorsque nous utilisons goroutine, nous constatons que le temps d'exécution de certains goroutines est trop long, dépassant le délai d'attente que nous avons défini, provoquant l'apparition anormale du programme entier ou son passage dans un état d'attente.

Étapes de la solution :
Voici les étapes détaillées pour résoudre l'erreur golang : goroutine a dépassé le délai d'attente.

Étape 1 : Utiliser le package de contexte
Le package de contexte est un package standard de golang, utilisé pour transférer les informations de contexte de la requête et contrôler le cycle de vie de la goroutine. Nous pouvons créer un contexte avec un timeout et le transmettre à la goroutine qui doit être exécutée.

Tout d'abord, nous devons importer le package de contexte :

import (
    "context"
    "time"
)
Copier après la connexion

Ensuite, nous créons un contexte avec un timeout :

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
Copier après la connexion

Dans le code ci-dessus, nous créons un contexte avec un timeout de 5 secondes en appelant la méthode context.WithTimeout . Dans le même temps, nous utilisons l'instruction defer pour garantir que l'exécution du contexte est annulée avant le retour de la fonction.

Étape 2 : Utilisez l'instruction select
Dans goroutine, en utilisant l'instruction select, nous pouvons attendre les résultats de retour de plusieurs canaux en même temps et définir le délai d'attente.

Là où nous voulons faire un appel goroutine, nous utilisons l'instruction select pour attendre le résultat :

select {
case <-ctx.Done():
    fmt.Println("Goroutine timeout")
case result := <-ch:
    fmt.Println("Result:", result)
}
Copier après la connexion

Dans le code ci-dessus, nous utilisons ctx.Done() pour recevoir le signal de timeout si le délai d'attente est atteint, nous afficherons les informations d'invite correspondantes. Et si la goroutine renvoie le résultat normalement, nous recevrons le résultat via le canal.

Étape 3 : Traitement du délai d'attente
Le code ci-dessus a implémenté la détection et le traitement du délai d'attente, mais lorsqu'un délai d'attente se produit, il n'arrête pas l'exécution de la goroutine. Afin de pouvoir arrêter l'exécution de goroutine, nous pouvons porter des jugements à l'intérieur de goroutine et renvoyer l'erreur correspondante lorsqu'un délai d'attente se produit.

Ce qui suit est un exemple de code qui montre comment déterminer le délai d'attente à l'intérieur d'une goroutine et renvoyer un message d'erreur :

go func() {
    select {
    case <-ctx.Done():
        fmt.Println("Goroutine timeout")
        return
    default:
        // 执行goroutine的逻辑
        // ...
    }
}()
Copier après la connexion

Dans le code ci-dessus, à l'intérieur de la goroutine, nous utilisons l'instruction select pour attendre le signal de délai d'attente. Si le délai d'attente est atteint, nous afficherons les informations d'invite correspondantes et reviendrons via l'instruction return pour arrêter l'exécution de la goroutine.

Exemple de code complet :
Ce qui suit est un exemple de code complet qui montre comment résoudre le problème de l'erreur golang : goroutine a dépassé le délai d'attente.

package main

import (
    "context"
    "fmt"
    "time"
)

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()

    ch := make(chan string)
    go func() {
        select {
        case <-ctx.Done():
            fmt.Println("Goroutine timeout")
            return
        default:
            time.Sleep(10 * time.Second)
            ch <- "Done"
        }
    }()

    select {
    case <-ctx.Done():
        fmt.Println("Goroutine timeout")
    case result := <-ch:
        fmt.Println("Result:", result)
    }
}
Copier après la connexion

Résumé :
En utilisant le package de contexte et l'instruction select, nous pouvons facilement résoudre le problème de l'erreur golang : la goroutine a dépassé le délai d'attente. En programmation simultanée, la définition et la gestion correctes du délai d'attente peuvent éviter les exceptions du programme et les longues attentes. J'espère que cet article pourra aider à résoudre le problème du délai d'attente des goroutines.

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