Maison  >  Article  >  développement back-end  >  Passer une copie du contexte de la coroutine principale au contexte du sous-programme

Passer une copie du contexte de la coroutine principale au contexte du sous-programme

WBOY
WBOYavant
2024-02-09 23:30:09601parcourir

Passer une copie du contexte de la coroutine principale au contexte du sous-programme

En PHP, la coroutine est un outil de programmation puissant qui peut améliorer l'efficacité d'exécution du code. Dans les coroutines, il est courant de transmettre une copie du contexte de la coroutine principale au contexte du sous-programme. De cette manière, les données contextuelles de la coroutine principale sont accessibles dans le sous-programme pour réaliser le partage et le transfert de données. Ce processus est très simple en PHP et il vous suffit d'utiliser le mot-clé rendement. Dans cet article, nous allons vous présenter en détail comment transmettre une copie du contexte de coroutine principal au contexte de sous-programme et vous donner un exemple de code pour vous aider à mieux comprendre et appliquer cette fonctionnalité.

Contenu de la question

J'ai un point de terminaison d'API Golang et son contexte associé.

Le point de terminaison doit faire un gros travail en coulisses, je crée donc un nouveau sous-programme à l'intérieur du point de terminaison principal et renvoie la réponse elle-même.

Pour gérer l'annulation du contexte, j'ai créé un contexte d'arrière-plan et l'ai transmis au sous-programme en tant que nouveau contexte.

Le problème est qu'en faisant cela, oui, je peux exécuter le sous-programme d'arrière-plan, mais les valeurs dans le contexte principal telles que l'ID de demande, l'ID de span, etc. (la plupart des clés que je ne connais pas) qui sont utilisées Pour le traçage sera perdu.

Comment transmettre le contexte parent à la routine enfant sans annuler l'exécution même après l'envoi de la réponse au client.

Modifier

Je ne transmets aucune valeur au contexte. Mais au départ, nous transmettons l'identifiant de demande, l'identifiant d'étendue, etc. requis pour le suivi. Ces informations sont toutes mises en contexte. Il s'agit d'une bibliothèque interne et le contexte est l'endroit où nous la sauvegardons.

Je sais qu'il s'agit d'un anti-modèle de transmission de valeurs à l'aide du contexte, aucune valeur ne sera transmise à l'exception de l'ID de demande et d'autres valeurs importantes pour la bibliothèque et non pour la logique métier

Solution de contournement

Lorsque vous annulez le contexte parent, supprimez-le. Tous les contextes dérivés seront également annulés. Vous avez donc raison de créer un nouveau contexte pour la goroutine générée par le gestionnaire de requêtes.

Lorsque vous créez un nouveau contexte, vous devez copier toutes les valeurs qui vous intéressent du contexte d'origine vers le nouveau contexte. Cependant, vous dites que vous ne connaissez pas toutes les clés. Par conséquent, vous pouvez toujours conserver une référence au contexte parent afin que sa valeur puisse être interrogée. Des choses comme ça :

type nestedContext struct {
   context.Context
   parent context.Context
}

func (n nestedContext)  Value(key any) any {
   return n.parent.Value(key)
}

...
newContext := nestedContext{
   Context:context.Background(),
   parent: parentContext,
}

Cela créera un nouveau contexte à partir de context.background() qui recherchera la valeur du contexte parent annulé.

Passez newcontext comme contexte à la goroutine créée à partir du gestionnaire.

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer