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.
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 (nichtmain
) 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