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

时间:2018-06-06 23:34:51

标签: 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() {
        defer close(c)
        wg.Wait()
    }()
    go func() {
        runFunc()
        c <- nil
        wg.Done()
    }()
    select {
    case <-c:
        return false
    case <-time.After(timeout):
        return true
    }
}

使用长时间运行的功能,但这适用于长时间运行的服务器,这可能导致大量内存泄漏/浪费的cpu周期。

1 个答案:

答案 0 :(得分:0)

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

  1. 让goroutine继续运行但停止等待/阻止它如上所示

  2. 将cgo调用背后的所有逻辑放在一个单独的可执行文件中,并在子进程中调用它。