Стратегии или поддержка для перезагрузки частей приложения Twisted? - PullRequest
3 голосов
/ 08 января 2010

Я написал специализированный JSON-RPC-сервер и только начал изучать логику приложения и обнаружил, что это раздражает постоянную необходимость останавливать / перезапускать сервер для внесения определенных изменений.

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

Есть ли способ для реактора остановить и перезапустить себя способом, подобным перезагружаемому HTTPS-серверу Пастера?

Ответы [ 2 ]

2 голосов
/ 08 января 2010

Вместе с Twisted поставляется модуль twisted.python.rebuild , так что это, вероятно, хорошее место для начала.

Также см. Этот вопрос SO: Проверка изменений кода во всех импортированных модулях Python

1 голос
/ 08 января 2010

Вы могли бы написать что-то похожее на перегрузчик Paster, которое будет работать так:

  1. запустите вашу основную функцию, и перед импортом / использованием какого-либо скрученного кода выполните форк / порождение подпроцесса.
  2. В подпроцессе запустите ваше скрученное приложение.
  3. В основном процессе запустите ваш код, который проверяет наличие измененных файлов. Если код изменился, перезагрузите подпроцесс.

Однако проблема здесь в том, что в отличие от веб-сервера разработки, большинство скрученных приложений имеют гораздо больше состояний, и простое уничтожение / перезапуск процесса - плохая идея, вы можете потерять некоторое состояние.

Есть способ сделать это чисто:

Когда вы создаете скрученное приложение, используйте subprocess.Popen() или аналогичный, чтобы получить трубы stdin / stdout. Теперь в вашем подпроцессе используйте витой реактор для прослушивания stdin (для этого есть код в витой, см. twisted.internet.stdio, который позволяет вам иметь протокол, который взаимодействует с транспортом stdio обычным витым неблокирующим образом)

Наконец, когда вы решите, что пришло время перезагрузить, напишите что-нибудь в stdin подпроцесса и попросите его завершить работу. Теперь ваш искаженный код может ответить и корректно завершить работу. Как только он завершится, ваш мастер-процесс может просто вызвать его снова.

(В качестве альтернативы вы можете использовать сигналы для достижения этой цели, но это может быть не переносимость ОС)

...