@proelixir

Страница 95 из 1045
Dmitry
30.08.2016
08:48:31
{:ok, users_registry} = Users.start_link {:ok, products_registry} = Products.start_link users_registry |> Products.add(%Product{..}) # crash in runtime

Eugene
30.08.2016
08:49:35
ну это точно никто не помешает сделать

Dmitry
30.08.2016
08:49:53
Вот я про это

Eugene
30.08.2016
08:50:03
ты хочешь чтоб была проверка в компайл тайм, насколько я понимаю

Google
Dmitry
30.08.2016
08:50:25
Это не возможно, но было бы не плохо

Aldar
30.08.2016
08:50:37
Старая то у меня тоже есть

Dmitry
30.08.2016
08:51:48
В примере то всё очевидно, но если динамически создавать процессы - можно где нибудь и проебаться. На самом деле это не проблема, отлавливается на тесте, но чувство какое-то паршивое

Eugene
30.08.2016
08:51:54
угу, пример хороший. не думаю что это возможно проверить во время компиляции

Dmitry
30.08.2016
08:52:10
Как если бы в ООП не было инкапсуляции

В принципе то оно нахер не нужно, но чувство паршивое)

Eugene
30.08.2016
09:00:17
если сильно нужны хоть какие-то эфемерные гарантии, можно делать так: всегда таскать пид в тупле рядом с его условным типом, например: { pid, :my_process_type }

и в функциях, которые получают такой тупль как аргумент – написать typespec

Alexander
30.08.2016
09:01:14
с ответом от Жозе: http://stackoverflow.com/questions/32085258/how-to-run-some-code-every-few-hours-in-phoenix-framework
а из крона дергать rpc Модуль.метод не проще? Хосе конечно определает куда двигаться, но то что он предлагает - ебаный беспросветный пиздец.

Eugene
30.08.2016
09:01:36
кроме того добавить тайпспеку в функциях, которые возвращают такой туплб само собой

Eugene
30.08.2016
09:03:23
Google
Alexander
30.08.2016
09:03:41
как раз кронтаб то легче менять чем релиз )

Dmitry
30.08.2016
09:03:54
решение с лупом и проверку, пора ли, это дно уровня while(sleep())
Мне кажется я найду парочку while sleep в сорцах крона))

Eugene
30.08.2016
09:04:55
зачем же релиз менять? могу ошибаться, но сложилось впечатление что у @Virviil контролировать расписание должен пользователь в рантайме

Dmitry
30.08.2016
09:05:28
С перезапуском если кто-то решит в бд поменять

Alexander
30.08.2016
09:06:23
и сбросом всего таймера, если нетворк мигнул или еще что-то

Dmitry
30.08.2016
09:07:06
и сбросом всего таймера, если нетворк мигнул или еще что-то
Это уже проблемы того, что этот хартбит принимает

Если я правильно тебя понял..

Eugene
30.08.2016
09:08:06
while sleep, всмысле

выглядит конечно не але

Alexander
30.08.2016
09:08:22
примерно так родилась идея майнить биткоины

Eugene
30.08.2016
09:08:46
но работает же, в том же elixir in action предлагают по максимуму использовать отп

Alexander
30.08.2016
09:09:15
дело в том, что крутить процессорное время в цикле с единственной целью, проверка пришла ли та нужная секунда времени, когда надо что-то запустить

хотя наверное в кроне так же реализовано ))

Dmitry
30.08.2016
09:10:24
Крон просто на сишке

Но тут вроде тож процессы легковесные

Поэтому надеюсь что будет так на так

Eugene
30.08.2016
09:10:43
разве в этом случае проц сильно нагружается? я думаю там скедулер эрланга пробегает по всем процессам, смотрит надо ли дать кому-то процессорное время. если процесс спит или ждет в блоке receive (а сообщения в инбоксе нету), то ему время вообще не выделяется

Alexander
30.08.2016
09:11:01
на си быстро отказались от лупов и есть блокирующий луп

который не откручивает процессор бесконечно

Google
Alexander
30.08.2016
09:11:34
это как паттернматчинг, только плюс луп

который откручивает 1 цикл если матч произошел

все остальное время он не топит печку

Dmitry
30.08.2016
09:12:07
Я думаю что Process.send_after/1 - это прям эрланговская с очень жёсткой оптимизацией функция

Eugene
30.08.2016
09:12:50
вспомнилось, кстати:

Dmitry
30.08.2016
09:12:52
Ну и по сути да - если ящик пуст то только на это и идёт проверка в вм

Eugene
30.08.2016
09:13:44
крон это опять же не скейлится™ :)

Alexander
30.08.2016
09:13:49
булшит, если происходит перманентный креш воркера, то по цепочке крешнится вообще все и не поднимется )

Dmitry
30.08.2016
09:13:58
Вот всётки думаю статику надо нгинксом

Alexander
30.08.2016
09:13:59
в книжке же по эрлангу написано

Eugene
30.08.2016
09:14:04
это смотря как систему задизайнить :)

по эрлангу не читал …

Dmitry
30.08.2016
09:14:41
это смотря как систему задизайнить :)
Да,, тогда всё упадёт только вместе с бим. Но так и обычныйц линукс может упасть

Alexander
30.08.2016
09:15:04
вообщем там дерево воркеров и супервайзеров, если один начинает крешится, то после лупа крешей он скажет своему родителю, что надо крешится. И так вся цепочка

Eugene
30.08.2016
09:15:19
угу

Alexander
30.08.2016
09:15:34
я без монита из дома вообще не выхожу

Eugene
30.08.2016
09:15:35
но это значит что ошибка в коде, на сколько я понимаю

Alexander
30.08.2016
09:19:04
дело в том что сервис краш рекавери лучше чем-то другим делать

Eugene
30.08.2016
09:19:29
это если речь идет о том, что крашится сам бим?

Alexander
30.08.2016
09:19:42
и я не могу понять эту любовь к upstart - он не поможет если крэшнится beam

Google
Eugene
30.08.2016
09:19:45
логично, в таком случае

Alexander
30.08.2016
09:20:39
кстати, нджинкс тоже нужен/

Eugene
30.08.2016
09:21:32
но простой happy path можно ведь и без nginx

Alexander
30.08.2016
09:21:35
есть пара плачей в интернете, что letsencrypt не работает нормально с фениксом да и вообще с эликсиром

Eugene
30.08.2016
09:21:46
то что nginx идет с кучей плюшек, это понятно

Dmitry
30.08.2016
09:22:14
Так ребят,стоп на пару сек. Application по сути - Supervisor?

Alexander
30.08.2016
09:23:44
да, можешь писать use Application и сразу делать Application.Supervisor.start_link

Dmitry
30.08.2016
09:23:45
В доках вот такой странный код: defmodule MyApp do use Application def start(_type, _args) do MyApp.Supervisor.start_link() end end

Admin
ERROR: S client not available

Eugene
30.08.2016
09:23:56
угу

Dmitry
30.08.2016
09:23:57
А где MyApp.Supervisor?

Eugene
30.08.2016
09:24:02
апликейшен это бихейвиор

Aldar
30.08.2016
09:24:06
Persistable data - Elixir?

Это как, БД чтоли на эликсире?

Dmitry
30.08.2016
09:24:20
Я его сам должен запилить, или он автоматиом генерируется из app-lication модуля?

Eugene
30.08.2016
09:24:20
у которого есть колбек, в котором стартует уже нормальный супервайзор

Это как, БД чтоли на эликсире?
БД на эрланге скорее

Eugene
30.08.2016
09:24:51
ETS, DETS, Mnesia

идут в комплекте с поставкой эрланга

Google
Aldar
30.08.2016
09:25:24
Они разве не только в оперативке?

Eugene
30.08.2016
09:25:33
ETS в оперативке

DETS – disk erlang term storage

т.е. уже на диске

Mnesia комбинирует свойства ets и dets, и дает еще какую-то кучу фич

то супервайзор уже быть должен

Dmitry
30.08.2016
09:27:26
Вот смотри код: defmodule Heartbeat do use Application # See http://elixir-lang.org/docs/stable/elixir/Application.html # for more information on OTP Applications def start(_type, _args) do import Supervisor.Spec, warn: false # Define workers and child supervisors to be supervised children = [ # Starts a worker by calling: Heartbeat.Worker.start_link(arg1, arg2, arg3) # worker(Heartbeat.Worker, [arg1, arg2, arg3]), ] # See http://elixir-lang.org/docs/stable/elixir/Supervisor.html # for other strategies and supported options opts = [strategy: :one_for_one, name: Heartbeat.Supervisor] Supervisor.start_link(children, opts) end end

Чисты после гена

opts = [strategy: :one_for_one, name: Heartbeat.Supervisor] вот строка которая вызывает вопрос

Файлика такого нет, вот я и думаю, что он автоматом генерирует такой модуль

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

или нет?

Eugene
30.08.2016
09:28:47
этот код надо читать так: “при запуске приложения выполнится функция Application.start, которая запустит супервайзор (с возможными дочерними процессами) и вернет его пид”

нет, не два

этот модуль отобразиться в один скомпилиный

opts = [strategy: :one_for_one, name: Heartbeat.Supervisor]

тут просто имя процесса-супервайзора указано, если ты об этом

тот-же эффект будет: opts = [strategy: :one_for_one, name: Vasya]

Dmitry
30.08.2016
09:29:59
Ясн

т.е я потом к нему по имени обращаюсь

Страница 95 из 1045