OK, um das Programm mit der aktiven Goroutine zu beenden?

8

Nehmen Sie das folgende Code-Snippet:

%Vor%

Die goroutine sollte für die Dauer der Ausführung laufen. Wenn die Select-Anweisung etwas vom Beendigungskanal empfängt, bricht sie die Schleife ab und das Programm endet, ohne dass versucht wird, die Goroutine zu stoppen.

Meine Frage: Wird dies vorübergehende Nebenwirkungen haben, die nicht offensichtlich sind, wenn Sie es ein- oder zweimal ausführen? Ich weiß, dass in anderen Sprachen Threads gereinigt werden sollten (d. H. Beendet werden), bevor das Programm endet, aber anders geht? Angenommen, querySomePeriodicThing() öffnet keine Dateideskriptoren oder Sockets oder irgendetwas, das schlecht offen bleiben würde.

    
josmith42 27.08.2014, 03:34
quelle

2 Antworten

16

Wie in der Spezifikation erwähnt, wird Ihr Programm beendet, wenn die main -Funktion abgeschlossen ist:

  

Die Programmausführung beginnt mit der Initialisierung des Hauptpakets und dem Aufruf der Funktion main . Wenn dieser Funktionsaufruf zurückkehrt, wird das Programm beendet. Es wartet nicht darauf, dass andere (nicht main ) Goroutinen beendet werden.

Die Tatsache, dass Sie noch andere Goroutines betreiben, ist aus sprachlicher Sicht kein Problem. Es kann immer noch ein Problem sein, abhängig davon, was Ihr Programm macht.

Wenn die Goroutine einige Ressourcen erstellt hat, die vor dem Programm-Exit bereinigt werden sollen, kann das Ausführen der Ausführung in der Mitte ein Problem sein: In diesem Fall sollten Sie Ihre main -Funktion darauf warten lassen, dass sie zuerst ausgeführt wird . Es gibt kein Äquivalent zu pthread_join , Sie müssen dies also selbst programmieren (z. B. indem Sie einen Kanal oder sync.WaitGroup verwenden).

Beachten Sie, dass einige Ressourcen beim Beenden des Prozesses automatisch vom Betriebssystem bereinigt werden (z. B. geöffnete Dateien, Dateisperren usw.), sodass in einigen Fällen keine spezielle Bereinigung erforderlich ist

    
James Henstridge 27.08.2014, 04:15
quelle
2

Goroutines sind keine Threads, sie sind sehr leicht und die Laufzeitumgebung bereinigt sie automatisch, wenn sie nicht mehr laufen oder wenn das Programm beendet wird.

    
OneOfOne 27.08.2014 03:48
quelle

Tags und Links