Maison > développement back-end > Golang > Réutiliser context.WithTimeout dans les fonctions de retard

Réutiliser context.WithTimeout dans les fonctions de retard

WBOY
Libérer: 2024-02-09 16:21:21
avant
1174 Les gens l'ont consulté

在延迟函数中重用 context.WithTimeout

Réutiliser context.WithTimeout dans une fonction de retard est un moyen efficace d'offrir un meilleur contrôle et une meilleure flexibilité lors de la gestion des opérations de délai d'attente. En utilisant la fonction context.WithTimeout fournie par l'éditeur PHP Youzi, vous pouvez définir un délai d'attente lors de l'exécution de la fonction. Une fois le temps défini dépassé, la fonction se fermera automatiquement et renverra un message d'erreur. Cette méthode peut éviter le blocage à long terme des fonctions et améliorer la stabilité et la réactivité du programme. Dans le même temps, en réutilisant context.WithTimeout dans la fonction de retard, un contrôle du délai d'attente de différentes fonctions peut également être obtenu, rendant le code plus concis et plus facile à maintenir.

Contenu de la question

L'extrait de code suivant (réduit par souci de concision) du billet de blog de démarrage rapide pour mongodb crée une fonction context.withtimeout ,并将其重用于延迟的 disconnect lors de la connexion à la base de données, ce qui, à mon avis, est problématique.

func main() {
    client, _ := mongo.newclient(options.client().applyuri("<atlas_uri_here>"))
    ctx, _ := context.withtimeout(context.background(), 10*time.second)

    _ = client.connect(ctx)
    defer client.disconnect(ctx)
}
Copier après la connexion

Mes pensées-

context.withtimeout Fixez la date limite en temps Unix lors de la création. Il est donc logique de le transmettre à connect puisque nous souhaitons annuler le processus d'établissement de la connexion lorsque le délai (c'est-à-dire le temps Unix dérivé) est dépassé.

Maintenant, ajoutez la même ctx 传递给延迟的 disconnect(很可能在将来稍后调用)将导致 ctx 的时间成为过去。意思是,当函数开始执行时它就已经过期了。这不是预期的结果,并且破坏了引用 disconnect logique au document -

If the context expires via cancellation,
deadline, or timeout before the in use connections have returned, the in use
connections will be closed, resulting in the failure of any in flight read
or write operations.
Copier après la connexion

Veuillez me dire si et comment je me trompe et/ou j'ai raté quelque chose.

Solution

Votre compréhension est correcte.

est suffisant dans l'exemple car l'exemple se connecte simplement à la base de données, effectue quelques exemples d'opérations (comme lister la base de données) puis main() se termine, donc exécuter la déconnexion retardée avec le même contexte ne causera aucun problème (l'exemple/ devrait fonctionner correctement dans les 10 secondes).

Dans les applications du « monde réel », ce n'est certainement pas le cas. Vous n’utiliserez donc probablement pas le même contexte pour vous connecter et vous déconnecter (à moins que ce contexte n’expire pas).

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!

source:stackoverflow.com
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal