【问题标题】:Timing Out A Long Running cgo Function Call长时间运行的 cgo 函数调用超时
【发布时间】:2021-12-22 01:52:15
【问题描述】:

我目前正在开发一个程序,该程序使用带有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 周期。

【问题讨论】:

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

标签: go timeout cgo


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多