Maison  >  Article  >  développement back-end  >  Le rôle du contexte dans la programmation concurrente des fonctions Golang

Le rôle du contexte dans la programmation concurrente des fonctions Golang

王林
王林original
2024-04-17 14:27:02669parcourir

Le package de contexte est utilisé pour gérer l'exécution des coroutines dans la programmation simultanée des fonctions Golang. Il fournit les fonctions suivantes : propager les signaux d'annulation et permettre aux coroutines d'interrompre d'autres coroutines avant que la tâche ne soit terminée. Fixez une date limite Si la coroutine n’est pas terminée dans le délai, elle sera automatiquement annulée. Transmettez des informations supplémentaires, permettant de transmettre des paires clé-valeur entre les coroutines.

Le rôle du contexte dans la programmation concurrente des fonctions Golang

Le rôle du contexte dans la programmation de fonctions simultanées dans Golang

Le package context est un outil clé dans Golang pour gérer l'exécution simultanée de fonctions. Il offre la possibilité de transmettre des signaux d'annulation de demande, des délais et d'autres informations pertinentes entre les coroutines. context包是Golang中用于管理函数并发执行的关键工具。它提供了在协程之间传递请求取消信号、截止时间和其他相关信息的能力。

作用

  • 取消信号传播:context允许协程传递取消信号,从而允许发起者协程在任务完成之前中断正在运行的协程。
  • 截止时间设置:context可以指定截止时间,如果协程在截止时间之前未完成,则自动取消。
  • 值传递:context可以携带任何类型的键值对,允许协程之间传递附加信息。

使用

要创建context对象,可以使用context.Background()context.WithCancel()

// 创建一个新context,取消信号为默认
ctx := context.Background()

// 创建一个带有取消信号的新context
ctx, cancel := context.WithCancel()

取消协程

要取消协程,只需调用cancel()函数。这将发送取消信号到所有监听该context的协程。

// 取消协程
cancel()

监听取消信号

协程可以使用context.Done()通道监听取消信号。当通道关闭时,表明context已取消。

// 监听取消信号
select {
case <-ctx.Done():
    // 处理取消
}

实战案例

考虑以下对HTTP请求进行超时的协程:

func MakeRequest(ctx context.Context, url string) (*http.Response, error) {
    // 创建一个带有截止时间的context
    ctx, cancel := context.WithTimeout(ctx, 10*time.Second)
    defer cancel()

    // 发起HTTP请求
    req, err := http.NewRequest(http.MethodGet, url, nil)
    if err != nil {
        return nil, err
    }

    req = req.WithContext(ctx)
    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        return nil, err
    }

    return resp, nil
}

在此示例中:

  • 使用context.WithTimeout()创建带有10秒截止时间的context
  • 请求被设置为此context,允许底层网络调用超时并取消请求。
  • defer cancel()确保在函数退出时取消context,防止任何其他协程被阻塞。

通过使用context

🎜Fonction🎜🎜
  • 🎜Propagation du signal d'annulation : 🎜context permet à la coroutine de transmettre des signaux d'annulation, permettant ainsi à la coroutine initiatrice d'interrompre la coroutine en cours d'exécution avant que la tâche ne soit terminée.
  • 🎜Paramètre de la date limite : 🎜context peut spécifier la date limite. Si la coroutine n'est pas terminée avant la date limite, elle sera automatiquement annulée.
  • 🎜Transmission de valeurs : 🎜context peut transporter tout type de paire clé-valeur, permettant de transmettre des informations supplémentaires entre les coroutines.
🎜🎜Utilisation de 🎜🎜🎜Pour créer un objet context, vous pouvez utiliser context.Background() ou context.WithCancel( ). 🎜rrreee🎜🎜Annuler la coroutine🎜🎜🎜Pour annuler la coroutine, appelez simplement la fonction <code>cancel(). Cela enverra un signal d'annulation à toutes les coroutines écoutant sur ce context. 🎜rrreee🎜🎜Écoutez les signaux d'annulation🎜🎜🎜La coroutine peut utiliser le canal context.Done() pour écouter les signaux d'annulation. Lorsque le canal est fermé, cela indique que le contexte a été annulé. 🎜rrreee🎜🎜Exemple pratique🎜🎜🎜Considérez la coroutine suivante qui expire les requêtes HTTP : 🎜rrreee🎜Dans cet exemple : 🎜
  • Utilisez context.WithTimeout( )Crée un <code>context avec un délai de 10 secondes.
  • La requête est définie dans ce contexte, permettant à l'appel réseau sous-jacent d'expirer et d'annuler la requête.
  • defer Cancel() Garantit que le context est annulé lorsque la fonction se termine, empêchant ainsi le blocage d'autres coroutines.
🎜En utilisant le context, nous pouvons contrôler l'exécution des coroutines et éviter les fuites de ressources et les attentes inutiles. 🎜

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