超时长时间运行的cgo函数调用

超时长时间运行的cgo函数调用,go,timeout,cgo,Go,Timeout,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() { defe

我目前正在编写一个程序,该程序使用带有
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
    }
}
func Timeout(Timeout time.Duration,runFunc func())bool{
var wg=new(sync.WaitGroup)
c:=make(chan接口{})
工作组.添加(1)
go func(){
延迟关闭(c)
wg.Wait()
}()
go func(){
runFunc()

只有两种方法可以中断cgo函数调用

  • 保持goroutine运行,但停止等待/阻塞,如上所示

  • 将cgo调用后面的所有逻辑放在一个单独的可执行文件中,并在子流程中调用它


  • 只有两种方法可以中断cgo函数调用

  • 保持goroutine运行,但停止等待/阻塞,如上所示

  • 将cgo调用后面的所有逻辑放在一个单独的可执行文件中,并在子流程中调用它


  • 不,您不能中断阻塞cgo调用。您可能希望在一个单独的进程中运行函数,该进程可以轻松终止和清理。@JimB如果您用该注释回答这个问题,我将选择它作为正确答案否,您不能中断阻塞cgo调用。您可能希望在一个单独的进程中运行函数,该进程可以轻松终止和清理杀死并清理干净。@JimB如果你用这个评论回答这个问题,我会选择它作为正确答案