Was ist eine idiomatische Methode, um WaitGroup.Wait () ein Zeitlimit zuzuweisen?
Der Grund, warum ich dies tun möchte, ist, meinen "Scheduler" davor zu bewahren, für immer auf einen fehlerhaften "Arbeiter" zu warten. Dies führt zu einigen philosophischen Fragen (d. H. Wie kann das System zuverlässig fortfahren, wenn es irrende Arbeiter hat?), Aber ich denke, das ist für diese Frage nicht möglich.
Ich habe eine Antwort, die ich zur Verfügung stellen werde. Jetzt, wo ich es niedergeschrieben habe, scheint es nicht so schlimm zu sein, aber es fühlt sich immer noch verworrener an, als es sollte. Ich würde gerne wissen, ob es etwas gibt, das einfacher, idiomatischer oder sogar ein alternativer Ansatz ist, der keine WaitGroups verwendet.
Ta.
Meistens ist Ihre Lösung, die Sie unten gepostet haben, so gut wie möglich. Ein paar Tipps, um es zu verbessern:
defer
statement zu verwenden, um die Vervollständigung zu signalisieren, es wird ausgeführt, selbst wenn eine Funktion abrupt beendet wird. WaitGroup
komplett weglassen und einfach einen Wert senden oder den Kanal schließen, wenn der Job abgeschlossen ist (der gleiche Kanal, den Sie in Ihrer select
-Anweisung verwenden) . timeout := time.Second
. Angeben von 2 Sekunden zum Beispiel ist: timeout := 2 * time.Second
. Sie brauchen die Konvertierung nicht, time.Second
ist bereits vom Typ time.Duration
und multipliziert diese mit einer untypisierten Konstante like 2
liefert auch einen Wert vom Typ time.Duration
. Ich würde auch eine Hilfsprogrammfunktion erstellen, die diese Funktionalität umschließt. Beachten Sie, dass WaitGroup
als Zeiger übergeben werden muss, andernfalls wird die Kopie nicht von den WaitGroup.Done()
-Aufrufen "benachrichtigt". Etwas wie:
Verwenden Sie es:
%Vor%Probieren Sie es auf dem Gehe Spielplatz aus.
Ich habe eine Bibliothek geschrieben, die die Concurrency-Logik Ссылка kapselt, über die Sie auch ein Timeout übergeben können.
Hier ist ein Beispiel ohne Zeitüberschreitung:
%Vor%Ausgabe:
%Vor%Hier ist ein Beispiel mit einem Timeout:
%Vor%Ausgabe:
%Vor%Tags und Links timeout concurrency go