2013-11-09 2 views
3

Мы разрабатываем несколько небольших сервисов для работы как демон unix.Сохранение демона python живым

Наша первая реализация была зависеть от скрученного реактора. Экземпляр реактора был нашим артефактом, чтобы поддерживать работоспособность ОС и работать без остановки после вызова подпроцесса.

В последнее время мы удалили Twisted зависимости для этих модулей, оставаясь при этом необходимостью продолжать работу процессов после вызова subprocess. Мы положили оператор 'while True: time.sleep(.1)' в конце нашего метода «main()», и он отлично работает.

С вызовом time.sleep(.1) наша производительность растрачивает производительность, учитывая события пробуждения ~ 600 раз в минуту. Это не очень хорошо для производительности нашего приложения. Если заменить

while True: 
    time.sleep(.1) 

по

while True: 
    pass 

потребляет так много процессорного времени (~ 1,7% от i5, постоянно).

Есть лучшие или сбалансированные альтернативные решения с меньшим удельным весом процессора и с гибкой производительностью для следующих параметров?

reactor.run() 

и

while True: 
    time.sleep(.1) 

Я нашел некоторые подобные ответы и обсуждения на StackOverflow и Интернете, но did'n найти четкое обсуждение он рассматривает питона.

+1

Я бы подумал, что функция сна фактически не теряет работоспособности. Сон заставляет процесс приостанавливаться, так что CPU может идти и делать другие вещи за это время. Если там, однако, нечего делать, кроме как выполнить ваше приложение, в любом случае нет такой вещи, как «отходы». – Jocke

+0

Сон сам по себе не делает, но называть его 600 раз в минуту только способствует тепловой смерти Вселенной. – Tritium21

+0

Наше приложение получает некоторые точечные сообщения на основе системных событий. Иногда он может получать поток сообщений. Если я пробуждаю процесс всего 600 раз в минуту, некоторые сообщения будут задерживаться и накапливаться для следующего события пробуждения. Я думаю, что время процессора может быть более эффективным, чем 600 раз в минуту, и дает больше времени для демона, чем мы вынуждаем вызовы функций высокого уровня (time.sleep) для управления им. Это одна из моих целей – apast

ответ

1

Возможно, решение состоит в том, чтобы просто использовать модуль, который ... был * собирался войти в стандартную библиотеку для этого.

https://pypi.python.org/pypi/python-daemon/

по-видимому, 3143 было отложено, но ссылка PyPI является осуществлением бодрости духа.

+0

Хорошо! Я попробую его и отвечу на результаты поведения здесь. Благодаря! – apast

+2

Как насчет использования супервизора - http://supervisord.org/ – Mutant

+0

supervisord отлично подходит для управления процессом уровня ОС. Наша проблема вызывает сомнения в некотором «питоническом» способе не прекращать сценарий после его нормального выполнения, сохраняя его в ожидании системных событий. – apast

Смежные вопросы