
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

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

Dmitry
30.08.2016
09:02:23

Alexander
30.08.2016
09:02:54

Eugene
30.08.2016
09:03:23

Google

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

Dmitry
30.08.2016
09:03:54

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
у которого есть колбек, в котором стартует уже нормальный супервайзор

Dmitry
30.08.2016
09:24:43

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
Ясн
т.е я потом к нему по имени обращаюсь