[Python] Как правильно остановить SocketServer?

Модератор: Модераторы разделов

Mike V. Girkin
Сообщения: 38
ОС: KUbuntu Linux 10.04

[Python] Как правильно остановить SocketServer?

Сообщение Mike V. Girkin »

Написал на python небольшой сервер, использующий класс SocketServer. Пока запускаю с помощью:
SocketServer.serve_forever()
На данный момент сервер из консоли запускается так:
exec python server.py &
Прекрасно понимаю, что не совсем корректно, но раньше устраивало :):
Однако возникла необходимость добавить возможность корректной остановки/перезапуска сервера, что при данном подходе невозможно (или я просто не знаю как?). Вот соответственно и вопрос к знающим людям - как правильно написать сервер, который будет корректно останавливаться и перезапускаться? Хотя б тыкните в доку...
[KUbuntu Linux 10.04] [Немножко программер]
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: [Python] Как правильно остановить SocketServer?

Сообщение watashiwa_daredeska »

Mike V. Girkin писал(а):
25.09.2008 16:31
Однако возникла необходимость добавить возможность корректной остановки/перезапуска сервера, что при данном подходе невозможно (или я просто не знаю как?). Вот соответственно и вопрос к знающим людям - как правильно написать сервер, который будет корректно останавливаться и перезапускаться? Хотя б тыкните в доку...

Воспользоваться модулем signal для обработки сигналов SIGINT (Ctrl-C при запуске не в режиме демона), SIGTERM (для останова), SIGHUP (принято использовать для перезапуска). Для останова сервера, думаю, достаточно будет server.socket.close() в обработчиках сигналов. Плюс нужен еще флажок, который будет означать перезапускать ли сервер (устанавливается в обработчике SIGHUP, но не в SIGINT и SIGTERM).

Вообще, в серверах принято делать режим (мне встречалось название "duck mode"), когда сервер уже не принимает новых задач, но ожидает, пока выполнятся все текущие. В SocketServer прямой поддержки этого нет, но можно сымитировать самому, ожидая завершения всех порожденных потоков или процессов после закрытия сокета.
Спасибо сказали: