取消 Go 中的阻止操作



我在第三方库中有一个我无法控制的阻止操作。它可能会永远消失。所以我想设置一个超时。显而易见的方法是用通道和goroutine包装它,然后选择带有time.After的结果。但是,问题是运行阻塞操作的goroutine可能会永远消失。

下面是一个说明此 http://repl.it/90o 的示例

有没有办法取消 goroutine 或将其垃圾回收?

你不能从"外面"阻止一个goroutine。goroutine必须支持某种终止信号(通常是通道)。但如果它没有,你就不能强迫它或杀死它。

如果你对你正在使用的第三方库无能为力,你最多能做的就是在不同的进程中运行它(在你的go应用程序启动的不同应用程序中),你可以杀死它,但那只是丑陋和太麻烦。

我认为你什么也做不了。在围棋中,你不能从外面阻止一个goroutine。如果你不能修复这个库,并且你认为它可以永远阻塞,那么写一个新的你可以控制的库。

最新更新