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

超时长时间运行的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.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况