Я пытаюсь реализовать параллелизм для повторяющейся задачи. Я хочу реализовать http-запрос на другом Goroutine (изображен функцией longRunningTask
). Я предоставляю таймер для механизма, чтобы остановить Goroutine, и отправляет сигнал тайм-аута на главный Goroutine, если задание с большой нагрузкой продолжает заданное время ожидания. Проблема, с которой я сталкиваюсь в настоящее время, заключается в том, что у меня прерывистое поведение.
Код был упрощен, чтобы выглядеть как показано ниже.
package main
import (
"fmt"
"time"
)
func main() {
var iteration int = 5
timeOutChan := make(chan struct{})
resultChan := make(chan string)
for i := 0; i < iteration; i++ {
go longRunningTaks(timeOutChan, resultChan)
}
for i := 0; i < iteration; i++ {
select {
case data := <-resultChan:
fmt.Println(data)
case <-timeOutChan:
fmt.Println("timed out")
}
}
}
func longRunningTaks(tc chan struct{}, rc chan string) {
timer := time.NewTimer(time.Nanosecond * 1)
defer timer.Stop()
// Heavy load task
time.Sleep(time.Second * 1)
select {
case <-timer.C:
tc <- struct{}{}
case rc <- "success":
return
}
}
Я считаю, что все попытки должны быть распечатаны
timeout
timeout
timeout
timeout
timeout
Вместо этого я получил прерывистый
success
timeout
timeout
timeout
timeout