контекст задачи. Вопрос про BEAM, надеюсь, что вопрос прочитает кто-то, кто в этом разбирается :)
Я хочу использовать Эликсир как скриптовый язык. Но одна вещь меня останавливает — время на разогрев. Пишу в оболочку:
$ time elixir -e 'IO.puts "hi"
Получаю ответ — выполнение заняло 554 миллисекунды.
Необходимость превратить исходный скрипт в байткод (.beam) проблемой для скриптинга не считаю. А вот со временем на разогрев — беда. Желательно, чтобы выполнение такой программы заняло до десяти миллисекунд, чтобы человек не заметил и можно было делить программу на множество таких скриптиков. Текущий план — переиспользовать запущенную BEAM, в которую загружать байткод скриптов, чтобы избежать времени разогрева. Я не знаю, как это сделать. В связи с этим возникают вопросы:
1) Есть ли какой-то удобный способ автоматизировать подрузку байткода в BEAM?
2) Есть ли удобный способ автоматизировать выгрузку модулей из BEAM после выполнения скрипта? Планируется, что экземпляр BEAM будет запускаться при запуске OS и работать бесконечно, в него будут загружаться скрипты. Не хочется, чтобы загруженные модули оставались внутри неё до перезагрузки.
3) Есть ли какой-то удобный способ делать это изолированно, чтобы один скрипт не мог использовать модули, определенные в другом скрипте? Это чем-то напоминает Docker и Linux name spaces, только не в Linux, а в BEAM. На сколько я знаю, в Java Virtual Machine есть подобный функционал, но я не эксперт.
4) Если удобных способов нет, есть ли впринципе техническая возможность сделать это? Я готов запариться и написать обертки.
5) Какие материалы читать, чтобы ответить на эти вопросы?
Я почти уверен, что ответ на первый вопрос — да, иначе бы оболочки iex, erl, а также hot code loading не работали бы. Но насчет остальных ответов на остальные вопросы не уверен.
Читал немного документацию BEAM на официальном сайте Erlang'а, но пока ответов на эти вопросы для себя не нашел. Скорее всего, недостаточно глубоко копал.
Попробуй через escript. https://hexdocs.pm/mix/main/Mix.Tasks.Escript.Build.html В erlang есть rebar3 escriptize (сам ребар так работает). Думаю копать нужно в этом направлении
Спасибо за наводки, но, насколько я понимаю, через escript запускается отдельная BEAM для каждого скрипта. Я не вижу в документации, как это изменить. Видел какой-то блог, там получилось через настройку BEAM опустить время разогрева до примерно 70-ти миллисекунд, что, конечно, лучше, чем 500, но все равно заметно. Надо будет попробовать. На моей машине Lua справляется с печатью «Hello» за 3 миллисекунды, Python — за 40, Bash — тоже за 3, а бинарники на C и Go — за одну. В идеале хотелось бы получить сетап с задержкой, сравнимой с Lua или Bash, чтобы можно было не беспокоиться о времени загрузки скрипта и создавать самые разные интерактивные скрипты в Elixir. Я думаю, это было бы замечательно. Я надеюсь, если заливать байткод напрямую в работающий экземпляр BEAM, то получится сделать запуск скриптов на Elixir гораздо шустрее. Если это возможно, а также если возможно решить задачи, описанные в пунктах ваше, это было бы прекрасно.
Устанавливать и удалять совсем не сложно. Смотри на модуль :code или Code. Там есть и загрузка и удаление модулей. Запускать изолированно способа нет ни у одного рантайма. Можно придумать пулл нод, например, но это всё натягивание совы на глобус. Я бы подсказать использовать какой-то другой инструмент для скриптов и всё. Хотя, если интересно покопать, есть всякие atomvm и пр., у которых лучше со скоростью запуска. Но это всё будет очень долго и сложно
А в каком языке есть изоляция в рамках одного инстанса? Ни в каком. У всех есть глобальные параметры рантайма Если тебе нужна параллельность, то пользуйся юниксовыми процессами. Если тебе нужна асинхронность, то я даже не могу представить скрипт, где это нужно
По сути, это свойство рантайма или ОС. Оно есть в Linux (name spaces) и Plan 9 (per process name spaces). Можно изолировать практически все ресурсы, при этом рантайм (или ОС) всего один. Поверх этого в Linux построены легковесные контейнеры, в т.ч. Docker. Еще в FreeBSD есть jails, но это, опять же, фича ОС. Больше не знаю, где такое есть. Может быть, в Java Virtual Machine есть такое? Там же столько всего есть.
там это прохачено на уровне загрузки кода. можно загружать разгве версии одного и того же кода. но изоляции по ресурсам нет.
Обсуждают сегодня