Lassen Sie mich ein Beispiel verwenden:Kann ich die Beendigung einer Goroutine erzwingen, ohne darauf zu warten, dass sie zurückkehrt?
func WaitForStringOrTimeout() (string, error) {
my_channel := make(chan string)
go WaitForString(my_channel)
select {
case found_string := <-my_channel:
return found_string, nil
case <-time.After(15 * time.Minute):
return nil, errors.New("Timed out waiting for string")
}
}
In diesem einfachen Beispiel, ich habe eine Funktion WaitForString die Blöcke für eine Weile und schließlich einen String zurückgeben kann. Ich möchte WaitForString mit diesem Code umbrechen, der entweder die gleiche Zeichenfolge zurückgibt oder ein Zeitlimit mit einem Fehler anzeigt.
Wenn eine Zeichenfolge schnell gefunden wird, ist es noch ein goroutine mit einer irgendwo schlafen Anweisung 15 Minuten laufen oder dieser Müll irgendwie gesammelt?
Wenn die Zeitüberschreitung auftritt und eine Zeichenfolge nie gefunden wird, gibt es noch eine goroutine, die WaitForString ausführt, obwohl es keine anderen Routinen gibt, die ihre Ausgabe beobachten können? Was passiert, wenn WaitForString viel Speicher zuweist, aber nie zurückkehrt?
Gibt es irgendeine Weise, die ich WaitForString machen kann() Kenntnis von der Timeout auftritt und aufgeben?
Ja, es wird halten, selbst wenn der Ausgangskanal läuft geschlossen ist. Die Timeout-Erkennung sollte in 'WaitForString' leben. Ich glaube nicht, dass es eine Möglichkeit gibt, die Goroutine zu bereinigen, indem man sie einpackt. – Alex
Sicher, ich könnte WaitForString() ändern, aber das ist ein einfaches Beispiel. Was ist, wenn der 2. Fall kein Timeout ist, sondern WaitForOtherString(). Ich muss nur warten, bis einer von ihnen fertig ist. Dann stecke ich wieder fest, da ich noch eine Funktion "über" diesen beiden mit der Select-Anweisung brauche. Wie kann ich die langsamere Goroutine stoppen? – Gregable
Letztendlich müssen Sie die Unterbrechungen selbst verwalten. Sehen Sie sich zum Beispiel http://play.golang.org/p/bpOGkIN9Ng an. WaitForString() muss beachten, dass es möglicherweise unterbrochen wird, und es muss einen Mechanismus geben, um es zu unterbrechen. Vielleicht kannst du auch panic/recover benutzen. – Alex