长时间 运行 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函数调用只有两种方式。

  1. 离开 goroutine 运行 但在上面停止 waiting/blocking

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