Size: a a a

2019 December 17

ЛЛ

Логичный Лесник in pro.elixir
Ладно, давай завтра подискутируем - я спать. Если чё - пиши в личку.
источник

SK

Simon Khaskelberg in pro.elixir
Слишком много времени занимают эти дискусии
источник

МБ

Максим Барулин in pro.elixir
Автор явно давненько видел пыху последний раз... Так как нынче просто Exception ловить не комильфо, ловят Throwbal. Про isset и null - нынче есть оператор ?? и не надо if isset
источник

МБ

Максим Барулин in pro.elixir
А в 7.4 завезли ещё кучу фишек, включает прелоадинг и улучшенную типизацию
источник

a

arikai in pro.elixir
Логичный Лесник
Не совсем. Есть Го, который умеет делать что-то понятное и осязаемое и делает это хорошо. А есть эрланг, который умеет супервизоры...
Вам, прошу прощения, супервизоры в кашу нагадили?
Если вы искренне не понимаете смысл супервизоров, то вам лучше не код с прода, а книжку почитать, тот же Learn you some Erlang, а именно главу про супервизоры, из которой и вынести, зачем, нужно или не нужно конкретно вам и так далее.

Тлдр: они позволяют следить за жизненным циклом других процессов и в случае их смерти рестартить их в соответствии с вашей (бизнес-)логикой.

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

Е

Евгений in pro.elixir
Если до конца быть честным, то в BEAM тоже не совсем вытесняющая многозадачность. ЕМНИП, планировщик в BEAM не по времени переключает задачу, а по вызовам функций
источник

Е

Евгений in pro.elixir
по сути while true i = 10 не может подвесить BEAM просто потому что там нет while :D а не потому что планировщик такой агрессивный
источник

a

arikai in pro.elixir
Это происходит по т.н. редукциям, и они начисляются не только по вызовам функций
источник

Е

Евгений in pro.elixir
arikai
Это происходит по т.н. редукциям, и они начисляются не только по вызовам функций
но переключение задач происходит именно между вызовами функций, то есть если написать очень длинную функцию, в миллиард строк, то таки такая функция заблочит все остальные процессы в планировщике
источник

Е

Евгений in pro.elixir
в этой функции не должно быть вызовов других функций естественно
источник

Е

Евгений in pro.elixir
на практике вероятность такого равна вероятности самораспада протона, но тем не менее
источник

Е

Евгений in pro.elixir
Логичный Лесник
Есть такое, но потом я по логам пойму где отвалилось и сделаю фикс. И потом уже падать не будет.
О я тоже так думал. Когда-то.
Для меня одно из важнейших преимуществ erlang/elixir это возможность подключиться к проду и выяснить что происходит.
Допустим какой-то час пик, сервис нагружен мульенами пользователей, смотришь статистику и чешешь репу: какая же сука внутри сервиса так жрет память? Логи тут тебе никак не помогут вообще.
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Евгений
в этой функции не должно быть вызовов других функций естественно
Я такое даже гипотетически представить не могу
источник

Е

Евгений in pro.elixir
Źmićer Rubinštejn
Я такое даже гипотетически представить не могу
и не надо :)
на практике вероятность такого равна вероятности самораспада протона, но тем не менее
источник

ŹR

Źmićer Rubinštejn in pro.elixir
Типа - что там будет?
источник

Е

Евгений in pro.elixir
Źmićer Rubinštejn
Типа - что там будет?
a = 1
a = 2
a = 3
...

такое не прокатит?
источник

Е

Евгений in pro.elixir
или биндинг это тоже вызов функции? :)
источник

Е

Евгений in pro.elixir
Наверняка есть операции без вызова функций. Скажем, модификация списка: a = [1 | a] - будет использовать вызовы функций?
источник

Е

Евгений in pro.elixir
впрочем забей, это абсолютно бессмысленное и бесполезное исследование :)
источник

ŹR

Źmićer Rubinštejn in pro.elixir
В качестве эксперимента, я запилил волшебный модуль который не делает нифига:

-module(bind).
-export([bind/1, bind/0]).

bind({a, X}) ->
 X.

bind() ->
 A=1,
 B=2,
 C=B+1,
 D=C+1,
 io:format("~p~n", [D]),
 ok.


И его дизассемблер:
{module, bind}.  %% version = 0

{exports, [{bind,0},{bind,1},{module_info,0},{module_info,1}]}.

{attributes, []}.

{labels, 9}.


{function, bind, 1, 2}.
 {label,1}.
   {line,[{location,"test.erl",4}]}.
   {func_info,{atom,bind},{atom,bind},1}.
 {label,2}.
   {test,is_tagged_tuple,{f,1},[{x,0},2,{atom,a}]}.
   {get_tuple_element,{x,0},1,{x,0}}.
   return.


{function, bind, 0, 4}.
 {label,3}.
   {line,[{location,"test.erl",7}]}.
   {func_info,{atom,bind},{atom,bind},0}.
 {label,4}.
   {allocate,0,0}.
   {move,{literal,[4]},{x,1}}.
   {move,{literal,"~p~n"},{x,0}}.
   {line,[{location,"test.erl",12}]}.
   {call_ext,2,{extfunc,io,format,2}}.
   {move,{atom,ok},{x,0}}.
   {deallocate,0}.
   return.


{function, module_info, 0, 6}.
 {label,5}.
   {line,[]}.
   {func_info,{atom,bind},{atom,module_info},0}.
 {label,6}.
   {move,{atom,bind},{x,0}}.
   {line,[]}.
   {call_ext_only,1,{extfunc,erlang,get_module_info,1}}.


{function, module_info, 1, 8}.
 {label,7}.
   {line,[]}.
   {func_info,{atom,bind},{atom,module_info},1}.
 {label,8}.
   {move,{x,0},{x,1}}.
   {move,{atom,bind},{x,0}}.
   {line,[]}.
   {call_ext_only,2,{extfunc,erlang,get_module_info,2}}.
источник