Изящное завершение работы веб-сервера не работает должным образом - PullRequest
0 голосов
/ 13 июня 2019

Ранее я писал о создании веб-сервера в Go с постепенным отключением.

https://marcofranssen.nl/go-webserver-with-gracefull-shutdown/#TLDR

Это решение отлично работает, однако для более крупного проекта я хотел бы дополнительно структурировать код.

Я реорганизовал этот код, как показано ниже.

https://gist.github.com/marcofranssen/699c1aa97c8a33ab20b5eccada275b08

По какой-то причине строка с srv.ListenAndServe(), по-видимому, не выполняется, в то время как постепенное отключение все еще выполняется в процедуре go, как и раньше.

Для меня код выглядит идентично, просто рефакторинг в отдельные файлы и добавлена ​​функция запуска.

Может кто-нибудь объяснить мне, почему он не выполняется, пока я не подам сигнал прерывания, заставляющий http-сервер сразу запускаться и завершать работу?

1 Ответ

0 голосов
/ 13 июня 2019

Я нашел ответ с помощью такого же суслика из сообщества.

Строка кода, содержащая srv.ListenAndServe(), является блокирующей строкой кода, в результате чего журнал после этой строки кода не создается.

В моем исходном коде, который я продемонстрировал в моем предыдущем блоге, этот журнал был перед строкой с srv.ListenAndServe(). Поэтому в этом примере тот же код регистрировался в консоли, как и ожидалось.

Так что в конце концов это была глупая ошибка, которую вы легко можете прочитать много раз. В основном 2 строки кода были поменяны местами, и я забыл о поведении блокировки http.ListenAndServe().

КЛЮЧ на вынос:

http.ListenAndServe () блокируется по определению и поэтому не будет запускать никакого кода после этой строки.

...