Изящное завершение работы веб-сервера не работает должным образом
Ранее я писал в блоге о создании веб-сервера в Go с постепенным отключением.
https://marcofranssen.nl/go-webserver-with-gracefull-shutdown/
Это решение прекрасно работает, однако для более крупного проекта я хотел бы дополнительно структурировать код.
Я рефакторинг этого кода, как в следующем гисте.
https://gist.github.com/marcofranssen/699c1aa97c8a33ab20b5eccada275b08
По какой-то причине строка с srv.ListenAndServe()
кажется, не выполняется, пока изящное завершение все еще выполняется в обычном режиме, как раньше.
Для меня код выглядит идентично, просто рефакторинг в отдельные файлы и добавлена функция запуска.
Может кто-нибудь объяснить мне, почему он не выполняется, пока я не подам сигнал прерывания, заставляющий http-сервер немедленно запускаться и завершать работу?
1 ответ
Я нашел ответ с помощью такого же суслика из сообщества.
Строка кода, содержащая srv.ListenAndServe()
является блокирующей строкой кода, приводящей к тому, что журнал после этой строки кода не возникает.
В моем исходном коде, который я продемонстрировал в моем предыдущем блоге, этот журнал был перед строкой с srv.ListenAndServe()
, Поэтому в этом примере тот же код регистрировался в консоли, как и ожидалось.
Так что в конце концов это была глупая ошибка, которую вы легко можете прочитать много раз. В основном 2 строки кода, где поменялись местами, и я забыл о поведении блокировки http.ListenAndServe()
,
КЛЮЧ на вынос:
http.ListenAndServe () блокируется по определению и поэтому не будет запускать какой-либо код после этой строки.