【发布时间】:2021-12-22 01:52:15
【问题描述】:
我目前正在开发一个程序,该程序使用带有cgo 的 c 库调用长时间运行的函数。我无法使用 c 编辑库以允许超时。到目前为止,我唯一的解决方案是让僵尸 goroutine 运行
func Timeout(timeout time.Duration, runFunc func()) bool {
var wg = new(sync.WaitGroup)
c := make(chan interface{})
wg.Add(1)
go func() {
defer close(c)
wg.Wait()
}()
go func() {
runFunc()
c <- nil
wg.Done()
}()
select {
case <-c:
return false
case <-time.After(timeout):
return true
}
}
长时间运行的功能正常工作,但这适用于长时间运行的服务器,随着时间的推移可能导致大量内存泄漏/浪费 cpu 周期。
【问题讨论】:
-
不,您不能中断阻塞的 cgo 调用。您可能希望在可以轻松杀死和清理的单独进程中运行这些函数。
-
@JimB 如果您用该评论回答这个问题,我会选择它作为正确答案