У меня есть горутина, назовем ее goProcessor
, которая обрабатывает запросы, поступающие от других горутин.
goProcessor
может обрабатывать только один запрос за раз. Если запрос, назовем его req2 , приходит, пока goProcessor
все еще обрабатывает предыдущий запрос req1 , req2 должен быть отброшен и будет просто потерян.
Я реализовал такой logi c, используя небуферизованный канал и оператор select
, но я не уверен, может ли быть более простой и элегантный способ sh того, что я хочу. Простой пример моего решения:
var c = make(chan string)
func main() {
goRequest := func(request string, delay int) {
time.Sleep(time.Duration(delay) * time.Second)
fmt.Printf("Here I am request %v\n", request)
select {
case c <- request:
fmt.Printf("%v sent\n", request)
default:
fmt.Printf("%v discarded\n", request)
}
}
goProcessor := func() {
for {
msg := <-c
fmt.Println("received", msg)
time.Sleep(3 * time.Second)
fmt.Println("processed", msg)
}
}
go goRequest("First req", 1)
go goRequest("Second req", 2)
go goRequest("Third req", 5)
go goProcessor()
time.Sleep(10 * time.Second)
fmt.Println("Main has finished")
}