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
WBOYavant
2024-02-09 16:21:211169parcourir

在延迟函数中重用 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)
}

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.

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer