在Go中取消阻止操作

Amj*_*sad 5 timeout go blocking goroutine

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

这是一个例子来说明这个http://repl.it/90o

有没有办法取消goroutine或收集垃圾?

icz*_*cza 8

您无法从“外部”停止 goroutine。goroutine 必须支持某种终止信号(通常是通道)。但如果没有,你就不能强迫它或杀死它。

如果你不能对你正在使用的 3rd 方库做任何事情,你能做的最多就是在不同的进程中运行它(在你的 go 应用程序启动的不同应用程序中),你可以杀死它,但这只是又丑又麻烦。