
Dmitry
04.10.2017
16:03:02
окей, а если у нас допустим есть 2 ген сервера. Когда мы коллим первый (наш поток останавливается), первый генсервер коллит второй генсервер, и поток исполнения первого генсервера тоже приостанавливается. Получается до тех пор пока первый генсервер ожидает ответа от второго, его никто не может коллить?

Dmitry
04.10.2017
16:03:23
точно
Может, тебе книжку почитать?

Dmitry
04.10.2017
16:03:30
вот блин

Google

Dmitry
04.10.2017
16:03:40
да, наверное стоит)

Dmitry
04.10.2017
16:03:43
Это считается базовыми вопросами

Nikolay
04.10.2017
16:04:12
колить то можно, просто будет в очереди
никто тебе не ответит условно)

Dmitry
04.10.2017
16:05:22
я просто ожидал что это будет работать как в ноде, что первый генсервер пока не пришел ответ от второго будет продолжать обрабатывать запросы
это же и есть неблокирующий IO

Alex
04.10.2017
16:05:39

Dmitry
04.10.2017
16:06:15
Тут нету неблокирующего ИО
Тут всё ИО блокирующее

Alex
04.10.2017
16:06:33
и все лезут к генсерверу с синхронными запросами а он всегда свободен и готов ответить еще на один ))

Dmitry
04.10.2017
16:06:56
Асинхронность достигается умелым манипулированием количеством генсерверов
Зато ты всегда точно знаешь, что выполнится первым, а что вторым
в отличие от ноды

Google

Dmitry
04.10.2017
16:08:16
проблема в том что зачастую мне и не надо знать что первое что второе
я могу запустить их пачкой и подождать пачкой
могу чейнить в промисах если нужна очередность

Dmitry
04.10.2017
16:08:48
Ты можешь запустить на каждый отдельный генсервер
Это бесплатно (почти)
Зато не нужны промисы
И чейны
И вообще ничего для синхронизации
Потому что всё и так синхронное

Alex
04.10.2017
16:11:11
и пока этот процесс работает первый может продолжать принимать запрос

Dmitry
04.10.2017
16:12:37
и как вернуть тогда результат от процесса?

Alex
04.10.2017
16:13:50
нее он может тут же запустить процесс , а сам перейти в ожидание другого запроса. а этот процесс по твоему желанию может сразу клиенту ответ вернуть

Dmitry
04.10.2017
16:14:12

Alex
04.10.2017
16:14:14
метод сервера который обрабатывает синхронный запрос
def handle_call(:select_stats, from, db) do
spawn(fn -> GenServer.reply from, DataProvider.select_stats(db) end)
{:noreply, db}
end
клиент будет синхронно висеть на таком запросе, сервер будет свободен, а работу будет выполнять spawn, который потом вернет клиенту результат: GenServer.reply from, DataProvider.select_stats(db)

Dmitry
04.10.2017
16:19:36
найс, то что ожидал
спасибо)

Google

Alex
04.10.2017
16:20:36
да это тут выше уже обсуждали, откуда я сам и узнал об этом )
каст скорее для того, чтобы послать туда задачу и забыть про нее. но по идее можно в каст отправить свой Pid, чтобы тот когда отработал послал тебе в процесс пакет с результатом. ну и в процессе клиента надо где-то выгребсти из очереди процесса этот результат

Dmitry
04.10.2017
16:25:02
а как клиент отработает результат каста, если его поток исполнения не блокирован?
там наверное только через месседжи

Dmitry
04.10.2017
16:26:22

Vita
04.10.2017
16:26:59
https://gist.github.com/UA3MQJ/d7572544d0922f0b9654c12ed3964c50

Alex
04.10.2017
16:27:06
если я правильно понял вопрос, то в таком случае клиент должен встать в receive в том месте кода где ему нужен результат сервера

Dmitry
04.10.2017
16:27:08

Alex
04.10.2017
16:28:08

Dmitry
04.10.2017
16:28:32

Alex
04.10.2017
16:34:31

Nikolay
04.10.2017
16:58:31
а хотелось бы

Dmitry
04.10.2017
16:59:25
Все эти send
и receive
И spawn
Ну нужны в otp
И являются индикатором неверной архитектуры
Почти всегда на 9 девяток процентов

Alex
04.10.2017
17:05:02
а есть какие нить книжки хорошие по архитектуре на OTP ? ну после learn you some erlang

Google

Alex
04.10.2017
17:06:28
так шоб много и сложно а не какой -ни ть hello world ?

Vita
04.10.2017
17:11:54
erlang in anger

Alex
04.10.2017
17:14:15
спасибо)

Taras ?
04.10.2017
17:52:48

Alexander
05.10.2017
01:24:03
https://github.com/ninenines/cowboy/releases/tag/2.0.0
ковбой дополз до версии 2. Ченджлога нет

Константин
05.10.2017
01:25:51
"так все же очевидно"))))

Vladimir
05.10.2017
02:12:54

Alex
05.10.2017
05:33:11
https://ninenines.eu/articles/cowboy-2.0.0/
у https://github.com/ninenines вообще нет ченджлогов ни в одном из пакетов, видимо это манера такая

Nikolay
05.10.2017
14:55:25
Ух щас у меня от Ecto полыхает…оказывается
apartment = nil
(from delivery_address in DeliveryAddress,
where: delivery_address.apartment == ^ apartment
) |> Repo.all
рейзит ошибку ** (ArgumentError) nil given for :apartment. Comparison with nil is forbidden as it is unsafe. Instead write a query with is_nil/1, for example: is_nil
странно, что я уже больше года пишу на эликсире и только сейчас это словил
разумеется на проде ?

Fey
05.10.2017
17:03:11
да, не очень удобно
я через dynamic разруливаю такие штуки

Nikolay
05.10.2017
17:29:40
@feymartynov а как тут dynamic заюзать? оО

Fey
05.10.2017
17:38:04
у меня как-то так:
defp filter(dynamic, "dir", nil) do
{:ok, dynamic([f, ft, t, fd], ^dynamic and is_nil(fd.parent_id))}
end
defp filter(dynamic, "dir", id) do
{:ok, dynamic([f, ft, t, fd], ^dynamic and fd.parent_id == ^id)}
end

Dmitry
05.10.2017
18:05:06
Как в эликсире соединить две in_memory мнезии в кластер?
Пытаюсь на двух нодах :mnesia.start

Google

Vladimir
05.10.2017
18:05:43
а сами ноды уже в кластере?

Dmitry
05.10.2017
18:05:58
А потом на одной из них :mnesia.change_config(:extra_db_nodes, ['two@cluster'])
и прям ошибку выдаёт
Ясно, надо было :"nodename"
а не 'nodename'

Nikolay
05.10.2017
20:10:58
у меня как-то так:
defp filter(dynamic, "dir", nil) do
{:ok, dynamic([f, ft, t, fd], ^dynamic and is_nil(fd.parent_id))}
end
defp filter(dynamic, "dir", id) do
{:ok, dynamic([f, ft, t, fd], ^dynamic and fd.parent_id == ^id)}
end
походу так же придётся сделать…я не привык к такому после AR ?


Marsel
05.10.2017
21:05:36
ребята, подскажите плиз что я делаю не так. Мне нужен пулл коннектов к базе. Делаю супервизора, который запускает воркера. В воркете в init запускаю Postgrex.start_link
https://gist.github.com/mvalitov/fcb61d34e8633fcac080634ded711a79 тут два файла
когда запускаю приложение, вижу в логе коннект к базе
23:51:21.933 [info] Connected to db my_app_dev: #PID<0.187.0>
Interactive Elixir (1.5.1) - press Ctrl+C to exit (type h() ENTER for help)
делаю селект DBClient.query({:get, "select * from users limit 5"}) к примеру
в логе вижу что почему то опять пошел коннект к базе
процесс #PID<0.186.0> делает select: select * from users limit 5
23:51:28.912 [info] Connected to db my_balance_dev: #PID<0.202.0>
и потом ошибка
23:51:28.937 [error] GenServer DBClient terminating
** (UndefinedFunctionError) function :invalid_message.exception/1 is undefined (module :invalid_message is not available)