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 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
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. context
peut spécifier la date limite. Si la coroutine n'est pas terminée avant la date limite, elle sera automatiquement annulée. context
peut transporter tout type de paire clé-valeur, permettant de transmettre des informations supplémentaires entre les coroutines. 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 : 🎜context.WithTimeout( )Crée un <code>context
avec un délai de 10 secondes.
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. 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!