dryeyhe0266
2018-06-06 23:34
浏览 98
已采纳

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

I am currently working on a program which calls a long running function using a c library with cgo. I cannot edit the library to allow for timeouts using c. My only solution so far was to leave a zombie goroutine running

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
    }
}

with the long running function working but this is for a long-running server which can lead to massive memory leaks/wasted cpu cycles over time.

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • dongmi3203 2018-06-18 18:49
    已采纳

    There are only two ways to interrupt a cgo function call.

    1. Leave the goroutine running but stop waiting/blocking on it as demonstrated above

    2. Put all of the logic behind the cgo call in a separate executable and call it within a subprocess.

    已采纳该答案
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题