Есть простенький сервер с longpolling-ом на Go. Есть 2 ендпоинта:
http.HandleFunc("/api/pss", pss)
http.HandleFunc("/api/wanna", wanna)
http.ListenAndServe(":8080", nil)
func pss(w http.ResponseWriter, r *http.Request) {
// Тут пишем в таблицу users и сразу отвечаем клиенту
}
func wanna(w http.ResponseWriter, r *http.Request) {
done := make(chan struct{})
go checkDb(done)
select {
case <- done:
doWanna(w)
case <- time.After(20 * time.Second):
doWanna(w)
}
}
func checkDb(done chan<- struct{}) {
for i := 0; i < 20; i++ {
// Проверяем изменения в таблице users
if hasChanges {
break
}
time.Sleep(time.Second)
}
done <- struct{}{}
}
func doWanna(w http.ResponseWriter) {
// Отвечаем клиенту
}
Я не очень понимаю как устроена многопоточность\синхронизация в go и у меня есть 2 кейса:
1. Клиент делает запрос к api/wanna, а затем к api/pss
2. Клиент делает запрос к api/pss, а затем к api/wanna.
В каком порядке придет ответ? Или в данном случае это не детерменировано? Желательно подробный ответ, и если есть ссылочка где можно просветиться на эту тему.