@ilitaexperta

Какой порядок обработки запросов в Go?

Есть простенький сервер с 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.

В каком порядке придет ответ? Или в данном случае это не детерменировано? Желательно подробный ответ, и если есть ссылочка где можно просветиться на эту тему.
  • Вопрос задан
  • 214 просмотров
Пригласить эксперта
Ответы на вопрос 2
Не совсем понятно о какой синхронизации и многопоточности речь. Ни того ни другого в приведённом коде не наблюдается.
Если клиент выполняет запросы синхронно, получит ответы в запрошенный последовательности. Если асинхронно, то в зависимости от того, какой запрос ваш сервер успеет обработать первым.
Ответ написан
akubintsev
@akubintsev
Опытный backend разработчик
Вопросы несколько странные. Похоже вас интересует не то, что вы спросили.
По теме синхронизации горутин mutex в помощь https://gobyexample.com/mutexes
Но вообще checkDb есть смысл запустить отдельной вечной горутиной на самом верхнем уровне и из неё писать в глобальную переменную lastChange, которую будет подхватывать http-хендлер, не блокируясь.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы