Maison  >  Article  >  développement back-end  >  Comment utiliser l’annulation de contexte dans Goroutine ?

Comment utiliser l’annulation de contexte dans Goroutine ?

王林
王林original
2024-06-06 10:29:43506parcourir

Utilisez la fonction d'annulation de contexte dans Go pour annuler gracieusement une Goroutine en cours : utilisez le package de contexte pour créer un contexte avec délai d'attente. Utilisez defer pour annuler le contexte lorsque la fonction revient. Utilisez l'instruction select dans Goroutine pour écouter les événements d'annulation.

如何在 Goroutine 中使用上下文取消功能?

Comment utiliser la fonction d'annulation de contexte dans Goroutine ?

Dans Go, le mécanisme d'annulation de contexte nous permet d'annuler gracieusement Goroutine en cours lorsque certaines conditions sont remplies. Ceci est utile pour les tâches qui doivent s'exécuter en arrière-plan mais qui peuvent être annulées si nécessaire.

Scénarios d'utilisation

L'annulation de contexte est particulièrement adaptée aux scénarios suivants :

  • Opération d'annulation de l'utilisateur
  • Tâche d'expiration
  • Gestion des erreurs en cas de conflit de ressources

Détails de l'implémentation

Pour utiliser l'annulation de contexte, vous vous devez utiliser le package context. Comme indiqué ci-dessous : context 包。如下所示:

package main

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

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

    go func() {
        for {
            select {
            case <-ctx.Done():
                fmt.Println("Context cancelled!")
                return
            default:
                fmt.Println("Working...")
                time.Sleep(1 * time.Second)
            }
        }
    }()

    time.Sleep(10 * time.Second)
}

在这个示例中:

  • context.WithTimeout() 创建了一个新的上下文,它将超时 5 秒。
  • defer cancel() 确保在 main 函数返回时取消上下文。
  • Goroutine 将运行一个无限循环,在 ctx.Done() 通道收到信号时退出。
  • 主流程将在 10 秒后退出,此时 Goroutine 将被取消。

实战案例

在真实的应用程序中,上下文取消可以用于以下任务:

  • Web 服务器: 当用户取消请求时取消 HTTP 处理程序。
  • 数据库连接: 当数据库连接不再需要时取消数据库查询。
  • 文件 I/O: 当文件传输需要取消时取消 I/O 操作。

注意事项

请注意以下注意事项:

  • 使用 context.Done() 通道来监听取消事件。
  • 应该在 Goroutine 中使用 defer cancel() 来在函数返回时取消上下文。
  • 在需要时使用 selectrrreee
  • Dans cet exemple :
🎜🎜context.WithTimeout() crée un nouveau contexte qui expirera pendant 5 secondes. 🎜🎜defer Cancel() garantit que le contexte est annulé au retour de la fonction principale. 🎜🎜Le Goroutine exécutera une boucle infinie et se terminera lorsque le canal ctx.Done() recevra un signal. 🎜🎜Le processus principal se terminera après 10 secondes et la Goroutine sera annulée à ce moment-là. 🎜🎜🎜🎜Cas réel 🎜🎜🎜Dans les applications réelles, l'annulation de contexte peut être utilisée pour les tâches suivantes : 🎜🎜🎜🎜Serveur Web : 🎜 Annulez les gestionnaires HTTP lorsque l'utilisateur annule la requête. 🎜🎜🎜Connexion à la base de données : 🎜 Annulez la requête de la base de données lorsque la connexion à la base de données n'est plus nécessaire. 🎜🎜🎜E/S de fichier : 🎜 Annulez l'opération d'E/S lorsque le transfert de fichier doit être annulé. 🎜🎜🎜🎜Notes🎜🎜🎜Veuillez noter ce qui suit : 🎜🎜🎜Utilisez le canal context.Done() pour écouter les événements d'annulation. 🎜🎜Vous devez utiliser defer Cancel() dans Goroutine pour annuler le contexte au retour de la fonction. 🎜🎜Utilisez l'instruction select pour écouter les événements d'annulation dans Goroutine en cas de besoin. 🎜🎜

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