Тайм-аут продолжительного вызова функции cgo - PullRequest
0 голосов
/ 07 июня 2018

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

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

1 Ответ

0 голосов
/ 18 июня 2018

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

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

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

...