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

Verwenden Sie context.WithTimeout in Verzögerungsfunktionen wieder

WBOY
WBOYnach vorne
2024-02-09 16:21:211129Durchsuche

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

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.

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen