2015-01-30 7 views
5

Ich habe eine Blockierung in einer Bibliothek von Drittanbietern, die ich nicht kontrolliere. Es könnte möglicherweise für immer gehen. Also möchte ich eine Zeitüberschreitung einstellen. Der offensichtliche Weg besteht darin, es mit einem Kanal und einer Goroutine zu umhüllen und dann das Ergebnis mit time.After auszuwählen. Das Problem ist jedoch, dass die Goroutine, die den Blockiervorgang ausführt, möglicherweise für immer gehen könnte.Abbrechen einer Blockierung in Go

Hier ist ein Beispiel zur Illustration http://repl.it/90o

Gibt es eine Möglichkeit, eine goroutine zu stornieren oder haben es Müll gesammelt?

+2

Ist die Drittanbieter-Bibliothek Open Source? Vielleicht können Sie das für sie reparieren und eine Pull-Anfrage senden. – tgrosinger

Antwort

3

Sie können eine Goroutine nicht von "draußen" stoppen. Die Goroutine muss eine Art von Beendigungssignalisierung unterstützen (meistens ein Kanal). Aber wenn nicht, kannst du es nicht erzwingen oder töten.

Wenn Sie nichts an der von Ihnen verwendeten 3rd-Party-Lib machen können, ist es am besten, sie in einem anderen Prozess (in einer anderen Anwendung, die von Ihrer Go-App gestartet wurde) auszuführen, den Sie töten können. aber das ist nur hässlich und zu umständlich.

0

Ich glaube nicht, dass Sie etwas tun können. In Go kann man eine Goroutine nicht von außen aufhalten. Wenn Sie diese Bibliothek nicht reparieren können und Sie denken, sie könnte für immer blockieren, dann schreiben Sie eine neue, die Sie kontrollieren könnten.