LINUX.ORG.RU

[питон][ынтырпрайз][вещества] настоящий module reloader (обновление программы на лету)

 ,


0

1

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

Питон из коробки так не умеет, imp.reload() это вообще ни о чем.

Итак, что я запилил:

  1. Лочатся все треды через imp.acquire_lock()
  2. Делается imp.reload()
  3. Через gc.get_objects() находятся все инстансы старых классов и у них подменяется __class__ (imp.reload() так не умеет)
  4. Находятся все модули которые делали «from module import ...» и у них обновляются все ссылки на старые классы (imp.reload() сосёт)
  5. высвобождаем блокировку тредов

По идее, должно работать так же с метаклассами. Конечно, при изменении структуры данных всё пойдёт раком, но для security and urgent fixes сойдёт.

Что скажете? Годно для продакшена? Пока моё основное сомнение только в скорости итерации по всем объектам.

сырцы (код аляповат немного, я немного поторописька)

cast tailgunner, baverman

ПЛЗ кастаните остальных гуру питона, кто у нас ещё разбирвается в этом?

★★★★★

Конечно, при изменении структуры данных всё пойдёт раком, но для security and urgent fixes сойдёт.

А что, реально нет возможности делать рестарт? Не java же.

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

А что, реально нет возможности делать рестарт?

1. академический интерес

2. Конечно, адекватные программы должны быть толеранты к рестарту. Но вот иногда попадаются такие которые, например, долго стартуют. Да, mocking для этого создан, но полевые испытания это полевые испытания.

3. Скоро уже космические корабли летать будут, а сервера/сервисы всё ещё ребутаются (хотя есть все технологии этого избежать). Да и просто очень хорошо для user experience предоставление сервиса без остановок. Вот лор иногда рестартится, причём в тот момент когда я сообщения пишу.

4. Иногда надо влезть в программу и понять что там происходит. Правда, для этого pdb есть, я щас его на ctrl+C повесил, экспериментирую....

true_admin ★★★★★
() автор топика

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

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

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

хотя есть все технологии этого избежать

Именно, называется балансер. Просто подымается новый инстанс приложения и нагрузка со старого переводится на новый.

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

Я подобное начал прикручивать к своему реплу,

а где на это можно посмотреть? (речь идёт о snaked, верно?)

true_admin ★★★★★
() автор топика

Я вообще считаю, что, если платформа изначально не спроектирована для таких трюков, ими лучше и не заниматься. Вот это:

находятся все инстансы старых классов и у них подменяется __class__

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

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

ссылки на классы хранятся в обычных списках

мда, тут оно зафейлило. Буду думать. Я так понимаю что если список хранить не в листе а в tuple то тогда ваще жопа.

Ладно, помечу как «ограниченно-годоное к использованию».

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