Wie finde ich heraus, ob eine Goroutine fertig ist, ohne zu blocken?

8

Alle Beispiele, die ich bisher gesehen habe, beinhalten das Blockieren des Ergebnisses (über den Operator <-chan ).

Mein aktueller Ansatz beinhaltet die Übergabe eines Zeigers an eine Struktur:

%Vor%

welches die Goroutine nach Beendigung schreibt. Dann ist es eine einfache Sache, finished zu überprüfen, wann immer es praktisch ist. Hast du bessere Alternativen?

Was ich wirklich anstrebe, ist ein Signal-Slot-System im Qt-Stil. Ich habe eine Ahnung, die Lösung wird fast trivial aussehen ( chan s haben viele unerforschten Potenzial), aber ich bin noch nicht vertraut genug mit der Sprache, um es herauszufinden.

    
György Andrasek 13.11.2009, 17:24
quelle

3 Antworten

12

Sie können das "comma, ok" -Muster verwenden (siehe Seite effective go "):

%Vor%     
James Antill 13.11.2009, 19:49
quelle
5

Select-Anweisungen ermöglicht es Ihnen, mehrere Kanäle gleichzeitig zu prüfen und eine zufällige Verzweigung (von denen, in denen die Kommunikation stattfindet) vorzunehmen wartet):

%Vor%
  

Für alle senden und empfangen   Ausdrücke in der "Select" -Anweisung,   die Kanalausdrücke werden ausgewertet,   zusammen mit allen möglichen Ausdrücken   auf der rechten Seite von senden   Ausdrücke in der Reihenfolge von oben nach unten.   Wenn einer der resultierenden Vorgänge kann   fortfahren, man ist auserwählt und der   entsprechende Kommunikation und   Aussagen werden ausgewertet. Andernfalls,   Wenn es einen Standardfall gibt, dann   führt aus; Wenn nicht, blockt die Anweisung   bis einer der Kommunikationen kann   vervollständigen.

    
u0b34a0f6ae 13.11.2009 18:20
quelle
3

Sie können auch einen Blick auf den Channel-Puffer werfen, um zu sehen, ob er irgendetwas enthält, indem Sie len verwenden:

%Vor%

Dies wird den Kanalpuffer nicht berühren, im Gegensatz zu foo, gotValue := <- ch , das einen Wert löscht, wenn gotValue == true .

    
William Casarin 14.11.2009 13:23
quelle

Tags und Links