Maison  >  Article  >  développement back-end  >  Comment utiliser le contexte pour implémenter le contrôle des tâches simultanées dans Go

Comment utiliser le contexte pour implémenter le contrôle des tâches simultanées dans Go

WBOY
WBOYoriginal
2023-07-22 15:01:17940parcourir

Le langage Go est un langage de programmation hautes performances qui prend en charge la programmation simultanée. Il est particulièrement puissant lorsqu'il s'agit de tâches simultanées. Dans Go, il existe un mécanisme très important qui peut nous aider à mieux contrôler les tâches simultanées, à savoir le contexte.

Context est un package standard dans Go qui fournit un moyen simple de transmettre des données à l'échelle d'une requête et de gérer le cycle de vie de la goroutine correspondante. Utilisez le contexte pour partager des données entre plusieurs goroutines et contrôler leur temps d'exécution.

Cet article présentera en détail comment utiliser le contexte pour implémenter le contrôle des tâches simultanées et fournira des exemples de code pertinents. Avant de commencer, nous devons installer l’environnement de développement du langage Go.

Tout d'abord, nous devons comprendre plusieurs types et fonctions de base dans le package de contexte :

  1. context.Context : représente le contexte d'une demande et contient des informations de base sur la demande, telles que le délai d'attente, le signal d'annulation, etc. Nous pouvons créer et transmettre des objets Context pour transmettre et partager des données entre plusieurs goroutines.
  2. context.WithCancel(parent context.Context) (context.Context, context.CancelFunc) : crée un nouveau contexte et renvoie une fonction qui peut être utilisée pour annuler ce contexte. Lorsque nous appelons cela CancelFunc, Context enverra un signal d'annulation à tous les contextes enfants.
  3. context.WithTimeout(parent context.Context, timeout time.Duration) (context.Context, context.CancelFunc) : crée un nouveau contexte et renvoie une fonction qui peut être utilisée pour annuler ce contexte. Lorsque le délai d'attente spécifié est dépassé, le contexte enverra automatiquement un signal d'annulation à tous les sous-contextes.

Avec les concepts de base ci-dessus, nous pouvons commencer à écrire du code. Supposons que nous devions implémenter une tâche pour télécharger des fichiers simultanément, chaque tâche de téléchargement devant avoir un délai d'attente et l'intégralité de la tâche de téléchargement pouvant être annulée manuellement si nécessaire.

Nous définissons d'abord une fonction Download pour simuler le processus de téléchargement de fichier :

func Download(ctx context.Context, url string) {
    // 模拟文件下载过程
    time.Sleep(2 * time.Second)
    fmt.Printf("Download %s success
", url)
}

Ensuite, nous définissons une fonction DownloadTask pour créer une tâche de téléchargement et démarrons une goroutine pour effectuer l'opération de téléchargement :

func DownloadTask(ctx context.Context, url string) {
    go func() {
        // 创建一个带有超时时间的Context
        ctx, cancel := context.WithTimeout(ctx, 3*time.Second)
        defer cancel()

        // 执行文件下载
        Download(ctx, url)
    }()
}

Dans la fonction principale, nous pouvons créons un contexte de niveau supérieur et le transmettons aux fonctions qui doivent effectuer des tâches simultanées selon les besoins :

func main() {
    // 创建一个顶层Context
    ctx := context.Background()

    // 创建一个带有取消函数的Context
    ctx, cancel := context.WithCancel(ctx)
    defer cancel()

    // 创建一个带有超时时间的Context
    ctx, timeoutCancel := context.WithTimeout(ctx, 10*time.Second)
    defer timeoutCancel()

    // 启动并发下载任务
    DownloadTask(ctx, "https://example.com/file1")
    DownloadTask(ctx, "https://example.com/file2")
    DownloadTask(ctx, "https://example.com/file3")

    // 等待任务完成
    time.Sleep(5 * time.Second)
}

Dans le code ci-dessus, nous créons un contexte de niveau supérieur et créons deux sous-contextes via WithCancel et WithTimeout. Ensuite, nous avons lancé trois tâches de téléchargement et défini le délai d'expiration de chaque tâche à 3 secondes. Enfin, nous utilisons time.Sleep pour attendre que la tâche soit terminée.

Grâce à l'exemple de code ci-dessus, nous pouvons voir qu'il est très simple d'utiliser le contexte pour le contrôle des tâches simultanées dans Go. Nous pouvons utiliser la méthode WithCancel pour créer un contexte annulable manuellement, utiliser la méthode WithTimeout pour créer un contexte automatiquement annulable et transmettre le contexte à la goroutine appropriée si nécessaire.

L'utilisation du contexte peut mieux contrôler le cycle de vie des tâches simultanées et éviter que l'ensemble du programme ne plante ou ne puisse se terminer en raison d'une exception dans une certaine tâche. En utilisant correctement le contexte, nous pouvons développer plus efficacement des programmes simultanés hautes performances.

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