Я пишу веб-приложение, в котором у меня давно запущена программа.Я хочу делегировать все HTTP-запросы в эту программу через каналы.Шаблон, с которым я столкнулся, таков:
// Internal long running goroutine
for{
select{
case e := <-event: //web request
req := e.req
// do something
....
select {
case <-ctx.Done():
//log
default:
e.replyTo <- result
}
}
}
// Web handler
http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
//decode request etc
...
replyTo := make(chan interface{}, 1)
ctx, cancel := context.WithCancel(context.BackGround())
event <- Event{req: req, ctx: ctx, replyTo: replyTo}
select{
case <-time.After(time.Second):
cancel()
//return 500
case r := <-replyTo:
// return some response
}
})
Я вижу, что в конце есть одна одиночная подпрограмма, так что параллелизм потерян, но я в порядке.
Является ли этот шаблон правильным способом сделать это?Какие еще подходы можно предложить?