Maison >développement back-end >Golang >Réutiliser context.WithTimeout dans les fonctions de retard
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.
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.
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!