Написал на python небольшой сервер, использующий класс SocketServer. Пока запускаю с помощью: SocketServer.serve_forever()
На данный момент сервер из консоли запускается так: exec python server.py &
Прекрасно понимаю, что не совсем корректно, но раньше устраивало :
Однако возникла необходимость добавить возможность корректной остановки/перезапуска сервера, что при данном подходе невозможно (или я просто не знаю как?). Вот соответственно и вопрос к знающим людям - как правильно написать сервер, который будет корректно останавливаться и перезапускаться? Хотя б тыкните в доку...
Однако возникла необходимость добавить возможность корректной остановки/перезапуска сервера, что при данном подходе невозможно (или я просто не знаю как?). Вот соответственно и вопрос к знающим людям - как правильно написать сервер, который будет корректно останавливаться и перезапускаться? Хотя б тыкните в доку...
Воспользоваться модулем signal для обработки сигналов SIGINT (Ctrl-C при запуске не в режиме демона), SIGTERM (для останова), SIGHUP (принято использовать для перезапуска). Для останова сервера, думаю, достаточно будет server.socket.close() в обработчиках сигналов. Плюс нужен еще флажок, который будет означать перезапускать ли сервер (устанавливается в обработчике SIGHUP, но не в SIGINT и SIGTERM).
Вообще, в серверах принято делать режим (мне встречалось название "duck mode"), когда сервер уже не принимает новых задач, но ожидает, пока выполнятся все текущие. В SocketServer прямой поддержки этого нет, но можно сымитировать самому, ожидая завершения всех порожденных потоков или процессов после закрытия сокета.