Изящное завершение работы веб-сервера не работает должным образом

Ранее я писал в блоге о создании веб-сервера в 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 () блокируется по определению и поэтому не будет запускать какой-либо код после этой строки.

Другие вопросы по тегам