LINUX.ORG.RU

Исправление кода во время эксплуатации

 ,


1

4

Посмотрел 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

Какие ещё могут быть проблемы с кодом, которые невозможно разрешить инжектированием методов?

★★★★★

После десятка апгрейдов питон распухнет :).

В общем, если ты правильно напишешь прогу то всё будет работать. Но что если тебе нужно, скажем, изменить поведение существующего класса? Это тоже можно сделать (я создавал такую тему с примером кода на лоре года три назад), но тут легко накосячить и всех случаев не учтёшь. В общем, я бы не стал такое использовать в продакшене. Есть другие варианты решения проблемы. Например, сохранять состояние на диск и перезапускать программу.

true_admin ★★★★★ ()

По первому абзацу подумал, что это опять шизофреник- anonimous.

anonymous ()

Проблема питона в том, что в нём для этого надо мутить эти инжекты и прочие костыли.

Всё было «из коробки» в том же Смолтоке ещё 30 лет назад.

yoghurt ★★★★★ ()
Ответ на: комментарий от yoghurt

Здесь так же уместно вспомнить Erlang: The Movie.

PS: Интересная часть, касательно данного топика, начинается с ~6:40

beastie ★★★★★ ()
Последнее исправление: beastie (всего исправлений: 1)

А зачем делать именно так? Пересылайте данные по IPC, и будет счастье.

tailgunner ★★★★★ ()

Какие ещё могут быть проблемы с кодом, которые невозможно разрешить инжектированием методов?

Сегфолт в сторонней либе. Любая невозможность дойти до кода с заменой кода. Тема классная, но почему там где про Lisp и Erlang, вдруг вылез питон?

t184256 ★★★★★ ()
Ответ на: комментарий от true_admin

[quоte] В общем, я бы не стал такое использовать в продакшене. Есть другие варианты решения проблемы. Например, сохранять состояние на диск и перезапускать программу. [/quоte]

Я так понял, что в случае с дальним космосом это не вариант. Даже на Земле в АСУТП, когда нужна постоянная выдача сигнала на управление, а процесс аварийного останова приводит к нежелательным эффектам, простая перезагрузка - не вариант. В условиях дальнего космоса добавлается нехилая задержка на коммуникации, и потому аппарат должен быть в большей степени автономным.

seiken ★★★★★ ()
Последнее исправление: seiken (всего исправлений: 2)
Ответ на: комментарий от true_admin

Как единственный способ работы с системой, вообще-то.

Всё есть отправка сообщения, что добавление класса, метода, их модификация, и т.д.

yoghurt ★★★★★ ()
Ответ на: комментарий от seiken

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

anonymous ()
Ответ на: комментарий от seiken

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

В таких случаях ставят три компа. И тогда их можно апгрейдить по-очереди.

true_admin ★★★★★ ()
Ответ на: комментарий от yoghurt

Всё есть отправка сообщения, что добавление класса, метода, их модификация, и т.д.

Можно ли в смолтолке взять ссылку на метод? И если да, как тогда его подменить? В лиспе есть символы, в питончике __code__.

bj ()
Ответ на: комментарий от bj

Можно ли в смолтолке взять ссылку на метод?

В смолтоке нет ссылок (ну или всё - ссылки, как тебе больше нравится).

Можно получить объект метода по словарю.

yoghurt ★★★★★ ()

Сдаётся мне, что в итоге получится сырая, глючная реализация борщелиспа.

Virtuos86 ★★★★★ ()
Ответ на: комментарий от bj

Я не понял, что ты имел в виду, там в любом случае мессадж пассинг.

yoghurt ★★★★★ ()

Основой управляемости лиспа является отладчик. Второй основой - возможность переопределять вещи на лету (не только методы, но можно классы менять, например, добавить поле).

Ты в норме можешь прервать исполнение любого треда и тред упадёт в отладчик. Также по умолчанию исключение вызывает отладчик на вершине стека, со всем состоянием в момент возникновения исключения и с возможностью перезапустить текущую функцию после внесения в неё изменений.

Ты хочешь имитировать отладчик архитектурой приложения? Думаю, это невозможно.

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

den73 ★★★★★ ()
Ответ на: комментарий от den73

P.S. например, если у тебя зациклился или навсегда завис на чтении из сети c2.run(), то твоя архитектура не спасёт, а отладчик может спасти.

den73 ★★★★★ ()
Ответ на: комментарий от den73

Для сетевых чтений есть таймаут. Для зацикливаний из-за ошибки в логике можно перед каждым run'ом запускать таймер с SIGALRM.

seiken ★★★★★ ()

Исправление кода во время эксплуатации

да очень просто!

LD_*

reprimand ★★★★★ ()
Ответ на: комментарий от seiken

Даже на Земле в АСУТП, когда нужна постоянная выдача сигнала на управление, а процесс аварийного останова приводит к нежелательным эффектам, простая перезагрузка - не вариант.

Не знаю насчет «простой перезагрузки», но сохранение состояния в контрольной точке и перезапуск - вполне вариант. Крайний вариант, конечно - если всё резервирование сфейлило.

tailgunner ★★★★★ ()

Он имел ввиду горячую подгрузку/замену кода - так умеют далеко не все.

Для осуществления subj нужна специфичная архитектура.

Минимум, реализация ФП и практически полный контроль за деревом кода.

Либо код === данные, как в лиспе (возможно есть еще какие-то код-данные-языки)

Так могут из коробки: erlang (приложения могут работать без остановки годами - встроенная возможность, управления горячими обновлениями), lisp. И наверное forth ещё.

Как альтернатива этим подходам - короткое время жизни объектов. Это например php :)

anonymous ()
Ответ на: комментарий от seiken

Для зацикливаний из-за ошибки в логике можно перед каждым run'ом >запускать таймер с SIGALRM.

Переполнение стека.

den73 ★★★★★ ()
Ответ на: комментарий от den73

Собственно, нет. Неправильно ответил. Забудь про переполнение стека. На какое время таймер ставить?

den73 ★★★★★ ()
Ответ на: комментарий от den73

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

seiken ★★★★★ ()
Ответ на: комментарий от seiken

Ладно. Включим это в смету (на самом деле тот или иной способ контроля зависания нужен в любом ЯП). А теперь переполнение стека.

den73 ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.