长时间 运行 cgo 函数调用超时
Timing Out A Long Running cgo Function Call
我目前正在开发一个程序,该程序使用带 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
}
}
使用长 运行 函数,但这是针对长 运行 服务器的,随着时间的推移会导致大量内存 leaks/wasted cpu 循环。
中断cgo函数调用只有两种方式。
离开 goroutine 运行 但在上面停止 waiting/blocking
将 cgo 调用背后的所有逻辑放在单独的可执行文件中,并在子进程中调用它。
我目前正在开发一个程序,该程序使用带 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
}
}
使用长 运行 函数,但这是针对长 运行 服务器的,随着时间的推移会导致大量内存 leaks/wasted cpu 循环。
中断cgo函数调用只有两种方式。
离开 goroutine 运行 但在上面停止 waiting/blocking
将 cgo 调用背后的所有逻辑放在单独的可执行文件中,并在子进程中调用它。