Тайм-аут длительного вызова функции cgo

В настоящее время я работаю над программой, которая вызывает долго работающую функцию, используя библиотеку c с cgo. Я не могу отредактировать библиотеку, чтобы разрешить тайм-ауты с помощью c. Мое единственное решение до сих пор состояло в том, чтобы оставить горутину-зомби работающей.

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

с работающей функцией долгого выполнения, но это для долго работающего сервера, что может привести к массивным утечкам памяти / потраченным впустую циклам процессора с течением времени.


person Evan Mosseri    schedule 06.06.2018    source источник
comment
Нет, вы не можете прервать блокирующий вызов cgo. Возможно, вы захотите запустить функции в отдельном процессе, который можно легко убить и очистить.   -  person JimB    schedule 07.06.2018
comment
@JimB, если вы ответите на этот вопрос этим комментарием, я выберу его как правильный ответ   -  person Evan Mosseri    schedule 13.06.2018


Ответы (1)


Есть только два способа прервать вызов функции cgo.

  1. Оставьте горутину работающей, но перестаньте ждать/блокировать ее, как показано выше.

  2. Поместите всю логику вызова cgo в отдельный исполняемый файл и вызовите его в подпроцессе.

person Evan Mosseri    schedule 18.06.2018