В настоящее время я работаю над программой, которая вызывает долго работающую функцию, используя библиотеку 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
}
}
с работающей функцией долгого выполнения, но это для долго работающего сервера, что может привести к массивным утечкам памяти / потраченным впустую циклам процессора с течением времени.