在 Go 中取消阻塞操作
cancel a blocking operation in Go
我在第 3 方库中有一个我无法控制的阻塞操作。它可能会永远消失。所以我想给它设置一个超时时间。显而易见的方法是用一个通道和一个 goroutine 包装它,然后用 time.After
在结果上 select。但是,问题是 goroutine 运行 阻塞操作可能会永远持续下去。
这里有一个例子来说明这一点http://repl.it/90o
有没有办法取消一个 goroutine 或让它被垃圾回收?
您无法从 "outside" 中停止 goroutine。 goroutine 必须支持某种终止信号(通常是通道)。但如果没有,你不能强迫它或杀死它。
如果您无法对正在使用的第 3 方库做任何事情,那么您最多可以 运行 在不同的进程中(在由您的 go 应用程序启动的不同应用程序中)你可以杀死它,但是那太丑陋而且太麻烦了。
我认为你无能为力。在 Go 中,你无法从外部停止 goroutine。如果您无法修复此库并且您认为它可能永远阻塞,那么请编写一个您可以控制的新库。
我在第 3 方库中有一个我无法控制的阻塞操作。它可能会永远消失。所以我想给它设置一个超时时间。显而易见的方法是用一个通道和一个 goroutine 包装它,然后用 time.After
在结果上 select。但是,问题是 goroutine 运行 阻塞操作可能会永远持续下去。
这里有一个例子来说明这一点http://repl.it/90o
有没有办法取消一个 goroutine 或让它被垃圾回收?
您无法从 "outside" 中停止 goroutine。 goroutine 必须支持某种终止信号(通常是通道)。但如果没有,你不能强迫它或杀死它。
如果您无法对正在使用的第 3 方库做任何事情,那么您最多可以 运行 在不同的进程中(在由您的 go 应用程序启动的不同应用程序中)你可以杀死它,但是那太丑陋而且太麻烦了。
我认为你无能为力。在 Go 中,你无法从外部停止 goroutine。如果您无法修复此库并且您认为它可能永远阻塞,那么请编写一个您可以控制的新库。