Zeitüberschreitung für WaitGroup.Wait ()

7

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.

    
laher 29.09.2015, 09:39
quelle

4 Antworten

17

Meistens ist Ihre Lösung, die Sie unten gepostet haben, so gut wie möglich. Ein paar Tipps, um es zu verbessern:

  • Alternativ können Sie den Kanal schließen, um die Vervollständigung zu signalisieren, anstatt einen Wert darauf zu senden. Eine Empfangsoperation auf einem geschlossenen Kanal kann immer fortgesetzt werden sofort .
  • Und es ist besser, defer statement zu verwenden, um die Vervollständigung zu signalisieren, es wird ausgeführt, selbst wenn eine Funktion abrupt beendet wird.
  • Auch wenn es nur einen "Job" gibt, auf den Sie warten müssen, können Sie den 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) .
  • Die Angabe einer Dauer von 1 Sekunde ist so einfach wie: 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:

%Vor%

Verwenden Sie es:

%Vor%

Probieren Sie es auf dem Gehe Spielplatz aus.

    
icza 29.09.2015, 12:12
quelle
4

Ich habe es so gemacht: Ссылка

%Vor%

Es funktioniert gut, aber ist es der beste Weg, es zu tun ?

    
laher 29.09.2015 09:39
quelle
0

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%     
Raed Shomali 25.06.2017 15:40
quelle
0

Dies ist keine wirkliche Antwort auf diese Frage, aber war die (viel einfachere) Lösung für mein kleines Problem, als ich diese Frage hatte.

Meine "Worker" haben http.Get () Anfragen gemacht, also habe ich das Zeitlimit für den http Client festgelegt.

%Vor%     
JtotheR 16.02.2018 10:13
quelle

Tags und Links