169 похожих чатов

Всем привет! Заранее извиняюсь за стену текста, в ней описывается

контекст задачи. Вопрос про 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'а, но пока ответов на эти вопросы для себя не нашел. Скорее всего, недостаточно глубоко копал.

6 ответов

21 просмотр

Попробуй через escript. https://hexdocs.pm/mix/main/Mix.Tasks.Escript.Build.html В erlang есть rebar3 escriptize (сам ребар так работает). Думаю копать нужно в этом направлении

Alan-Urmancheev Автор вопроса
Yakov Kozlov
Попробуй через escript. https://hexdocs.pm/mix/mai...

Спасибо за наводки, но, насколько я понимаю, через escript запускается отдельная BEAM для каждого скрипта. Я не вижу в документации, как это изменить. Видел какой-то блог, там получилось через настройку BEAM опустить время разогрева до примерно 70-ти миллисекунд, что, конечно, лучше, чем 500, но все равно заметно. Надо будет попробовать. На моей машине Lua справляется с печатью «Hello» за 3 миллисекунды, Python — за 40, Bash — тоже за 3, а бинарники на C и Go — за одну. В идеале хотелось бы получить сетап с задержкой, сравнимой с Lua или Bash, чтобы можно было не беспокоиться о времени загрузки скрипта и создавать самые разные интерактивные скрипты в Elixir. Я думаю, это было бы замечательно. Я надеюсь, если заливать байткод напрямую в работающий экземпляр BEAM, то получится сделать запуск скриптов на Elixir гораздо шустрее. Если это возможно, а также если возможно решить задачи, описанные в пунктах ваше, это было бы прекрасно.

Устанавливать и удалять совсем не сложно. Смотри на модуль :code или Code. Там есть и загрузка и удаление модулей. Запускать изолированно способа нет ни у одного рантайма. Можно придумать пулл нод, например, но это всё натягивание совы на глобус. Я бы подсказать использовать какой-то другой инструмент для скриптов и всё. Хотя, если интересно покопать, есть всякие atomvm и пр., у которых лучше со скоростью запуска. Но это всё будет очень долго и сложно

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

Alan-Urmancheev Автор вопроса
Lama Lover
А в каком языке есть изоляция в рамках одного инст...

По сути, это свойство рантайма или ОС. Оно есть в Linux (name spaces) и Plan 9 (per process name spaces). Можно изолировать практически все ресурсы, при этом рантайм (или ОС) всего один. Поверх этого в Linux построены легковесные контейнеры, в т.ч. Docker. Еще в FreeBSD есть jails, но это, опять же, фича ОС. Больше не знаю, где такое есть. Может быть, в Java Virtual Machine есть такое? Там же столько всего есть.

Alan Urmancheev
По сути, это свойство рантайма или ОС. Оно есть в ...

там это прохачено на уровне загрузки кода. можно загружать разгве версии одного и того же кода. но изоляции по ресурсам нет.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта