Посмотрел Google techtalks про дальнекосмические миссии NASA, в которых обсуждалась ситуация удалённого исправления багов на уже летящем аппарате. Докладчик говорил, что с Lisp это было очень просто реализовать, сожалея о том, что руководство решило отказаться от подсистем, написанных на Lisp'е. Вот я и подумал, какие проблемы могут возникнуть в программе на Python, которые невозможно исправить в программе «на ходу», при условии, что в ней архитектурно заложены механизмы подобных (типичных) исправлений.
Я начинаю рассмотрение с заранее упрощенной модели, в которой управление аппаратом сводится к поочерёдному цикличному вызову компонентов, управляющих различными подсистемами (один поток выполнения).
c1 = Component1()
c2 = Component2()
...
cN = ComponentN()
while True:
c1.run()
c2.run()
...
cN.run()
Допустим, какой-то из методов run содержит баг. В конце тела цикла можно предусмотреть опрос заранее определённого для этого флага, установка которого (вне данного потока) будет означать, что необходимо заменить метод run. Какой именно метод - можно указать в том же флаге или как-либо иначе, в простейшем варианте можно считать, что ненулевое значение флага идентифицирует номер класса, допустим, j. Помимо этого, установка флага будет означать, что средствами коммуникации с Земли на аппарат закачивается модуль inject.py с кодом метода. Тогда в конце тела цикла делается что-то вроде:
if do_inject:
from inject import new_run
cj.run = types.MethodType(new_run, self)
do_inject = False
Какие ещё могут быть проблемы с кодом, которые невозможно разрешить инжектированием методов?