我目前正在开发一个程序,该程序使用带有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周期。
答案 0 :(得分:0)
只有两种方法可以中断cgo函数调用。
让goroutine继续运行但停止等待/阻止它如上所示
将cgo调用背后的所有逻辑放在一个单独的可执行文件中,并在子进程中调用它。