@proelixir

Страница 752 из 1045
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

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
нее он может тут же запустить процесс , а сам перейти в ожидание другого запроса. а этот процесс по твоему желанию может сразу клиенту ответ вернуть

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
Alex
04.10.2017
16:34:31
а как клиент отработает результат каста, если его поток исполнения не блокирован?
по идее такой способ работы тоже имеет право быть. к примеру клиентский процесс отправляет асинхронно серверу задачу (cast), далее клиент еще что-то делает, и когда ему потребуется результат работы сервера он встает в receive ожидая сообщения от сервера

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
спасибо)

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
ковбой дополз до версии 2. Ченджлога нет
Решили, что вроде похоже на 2.0 и просто поменяли номер версии.

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'

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)

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