Heim > Backend-Entwicklung > Golang > Verwenden Sie context.WithTimeout in Verzögerungsfunktionen wieder

Verwenden Sie context.WithTimeout in Verzögerungsfunktionen wieder

WBOY
Freigeben: 2024-02-09 16:21:21
nach vorne
1179 Leute haben es durchsucht

在延迟函数中重用 context.WithTimeout

Die Wiederverwendung von context.WithTimeout in einer Verzögerungsfunktion ist eine effektive Möglichkeit, eine bessere Kontrolle und Flexibilität bei der Handhabung von Timeout-Vorgängen zu gewährleisten. Mit der context.WithTimeout-Funktion des PHP-Editors Youzi können Sie während der Funktionsausführung eine Zeitüberschreitung festlegen. Sobald die festgelegte Zeit überschritten wird, wird die Funktion automatisch beendet und gibt eine Fehlermeldung zurück. Diese Methode kann eine langfristige Blockierung von Funktionen vermeiden und die Stabilität und Reaktionsfähigkeit des Programms verbessern. Gleichzeitig kann durch die Wiederverwendung von context.WithTimeout in der Verzögerungsfunktion auch eine Timeout-Steuerung verschiedener Funktionen erreicht werden, wodurch der Code präziser und einfacher zu warten ist.

Frageninhalt

Der folgende Codeausschnitt (der Kürze halber gekürzt) aus dem Go-Schnellstart-Blogbeitrag für Mongodb erstellt eine context.withtimeout ,并将其重用于延迟的 disconnect-Funktion beim Herstellen einer Verbindung zur Datenbank, was meiner Meinung nach problematisch ist.

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)
}
Nach dem Login kopieren

Meine Gedanken-

context.withtimeout Legen Sie bei der Erstellung eine Frist in Unix-Zeit fest. Daher ist es sinnvoll, es an connect zu übergeben, da wir den Vorgang des Verbindungsaufbaus abbrechen möchten, wenn das Zeitlimit (d. h. die abgeleitete Unix-Zeit) überschritten wird.

Fügen Sie nun die gleiche ctx 传递给延迟的 disconnect(很可能在将来稍后调用)将导致 ctx 的时间成为过去。意思是,当函数开始执行时它就已经过期了。这不是预期的结果,并且破坏了引用 disconnect Logik zum Dokument hinzu –

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.
Nach dem Login kopieren

Bitte sagen Sie mir, ob und wie ich falsch liege und/oder etwas übersehe.

Lösung

Ihr Verständnis ist richtig.

reicht im Beispiel aus, da das Beispiel lediglich eine Verbindung zur Datenbank herstellt, einige Beispieloperationen ausführt (z. B. das Auflisten der Datenbank) und dann main() endet, sodass das Ausführen der verzögerten Trennung mit demselben Kontext keine Probleme verursacht (das Beispiel wird/ sollte innerhalb von 10 Sekunden einwandfrei funktionieren).

Bei Anwendungen in der „realen Welt“ ist dies sicherlich nicht der Fall. Daher werden Sie wahrscheinlich nicht denselben Kontext zum Herstellen und Trennen der Verbindung verwenden (es sei denn, dieser Kontext führt zu keiner Zeitüberschreitung).

Das obige ist der detaillierte Inhalt vonVerwenden Sie context.WithTimeout in Verzögerungsfunktionen wieder. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage