«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как корректно завершить работу HTTP-сервера после возврата ответа?

Как корректно завершить работу HTTP-сервера после возврата ответа?

Опубликовано 7 ноября 2024 г.
Просматривать:739

How to Gracefully Shut Down an HTTP Server After Returning a Response?

Завершение работы HTTP-сервера после возврата ответа

Вы разрабатываете бота командной строки, который взаимодействует с API Instagram с использованием OAuth, который не оптимизирован для командной строки приложения. Чтобы преодолеть эту проблему, вы настроили локальный HTTP-сервер в качестве URI перенаправления для авторизации. После того как пользователь авторизует приложение и будет перенаправлен на сервер, вы захотите выключить сервер после отображения токена доступа.

Вы столкнулись с проблемой при реализации механизма завершения работы. В частности, вызов srv.Shutdown(nil) в обработчике запроса (showTokenToUser) приводит к ошибке:

2017/11/23 16:02:03 Httpserver: ListenAndServe() error: http: Server closed
2017/11/23 16:02:03 http: panic serving [::1]:61793: runtime error: invalid memory address or nil pointer dereference

Решение

Проблема возникает из-за того, что вы вызывают srv.Shutdown(nil) несколько раз:

  1. В обработчике showTokenToUser, где он находится внутри замыкания.
  2. После того, как обработчик завершит выполнение в основной функции.

Вызов srv.Shutdown, когда сервер все еще прослушивает соединения, приводит к состоянию гонки. Горутина ListenAndServe() пытается закрыть открытые прослушиватели и простаивающие соединения, но она прерывается последующим вызовом Shutdown при закрытии обработчика. Такое несоответствие состояний вызывает панику.

Чтобы решить эту проблему, вы можете использовать один из двух методов:

1. Используйте context.WithCancel:

При таком подходе вы создаете context.Context с функцией отмены. Контекст передается горутине ListenAndServe и функции-обработчику showTokenToUser. Внутри обработчика, когда токен доступа отображается пользователю, вы вызываете функцию отмены, чтобы завершить контекст. Горутина ListenAndServe корректно завершит работу сервера при отмене контекста.

2. Используйте тот же контекст:

Вместо вызова context.WithCancel вы можете передать тот же context.Context горутине ListenAndServe и функции-обработчику. Когда токен доступа отображается, вы вызываете метод cancel() в контексте, что вызывает завершение работы как обработчика, так и горутины ListenAndServe.

После реализации любого подхода не забудьте дождаться функции srv.Shutdown. завершить перед выходом из программы.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3