Все мы знаем как важно уметь программам обновляться на горячую. Поэтому более ни слова об этом.
Питон из коробки так не умеет, imp.reload() это вообще ни о чем.
Итак, что я запилил:
- Лочатся все треды через imp.acquire_lock()
- Делается imp.reload()
- Через gc.get_objects() находятся все инстансы старых классов и у них подменяется __class__ (imp.reload() так не умеет)
- Находятся все модули которые делали «from module import ...» и у них обновляются все ссылки на старые классы (imp.reload() сосёт)
- высвобождаем блокировку тредов
По идее, должно работать так же с метаклассами. Конечно, при изменении структуры данных всё пойдёт раком, но для security and urgent fixes сойдёт.
Что скажете? Годно для продакшена? Пока моё основное сомнение только в скорости итерации по всем объектам.
сырцы (код аляповат немного, я немного поторописька)
cast tailgunner, baverman
ПЛЗ кастаните остальных гуру питона, кто у нас ещё разбирвается в этом?