
Константин
09.08.2016
09:50:43
Но логика то от этого не стала мультизадачной. Мне тут внутри надо будет делать Task.start_link для каждого url?
Я задачу не до конца объяснил.. у меня есть список url 40 тысяч штук
мне надо на каждый зайти и забрать инфу, желательно делать или все разом, или по 100-1000 штук разом
И каждый раз, при ошибке получения данных, он начнет все заново.. как-то жестоко)))

Google

Dmitry
09.08.2016
09:58:31
Пул делай
И обработку ошибок

Константин
09.08.2016
09:58:54
У меня уже есть готовый парсер без использования OTP. Если валился один из запросов - он не валил все остальные.
Проблема только с запуском
Я компилю код и выполняю его внутри iex -S mix
Можно делать и mix run, но тогда нереально сделать билд exrm
он требует наличие application
Поэтому я и спросил у вас как сделать через application, но грохать его по окончанию работы. Попробую запустить много Task и собирать из них данные

Dmitry
09.08.2016
10:13:43
Много одинаковых генсерверов
Посмотри статью мою
На хабре
https://habrahabr.ru/post/306500/

Константин
09.08.2016
10:39:33
ок, спс.. еще я глянул на poolboy

Google

Константин
09.08.2016
10:40:01
похоже на то, что мне может пригодиться
хотя сомневаюсь.. ведь HTTPoison и так его юзает и не даст выполнить запросов больше положенного

Dmitry
09.08.2016
10:41:11
Значит поизон можно законыигурировать на величину пула
У него есть асинхронные методы
Пишешь сервер который получает от поизона каст и пишет в екто
Потому что екто тоже использует пулбой
Для обращения к базе

Константин
09.08.2016
10:43:28
мне надо больше практики))) прочитано уже много, но по факту ничего толкового написать не получается.
Хорошо хоть вот работадатель не жалутся, что уже второй парсер пишу на эликсире

Dmitry
09.08.2016
10:44:22
Фишка крутых библиотек в том, что они автоматически работают с максимальной производительностью и конкурентномтью

Yusup
09.08.2016
11:48:00
https://habrahabr.ru/post/306500/
всем привет. у меня вопрос по поводу common way в эликсире. в самом первом примере кода модуля Chat.Server мы объявляем шесть методов - три из них API, еще три - колбеки генсервера. как я понял - это common way в эликсире хранить имплементацию и API в одном модуле. но с другой стороны получается, что у нас наружу торчат колбеки и их кто угодно может дергать. можно ли как-то сделать их невидимыми для внешнего мира? как я понимаю, defp тут не прокатит, так как behavior требует, чтобы колбеки были публичными.

Dmitry
09.08.2016
11:50:08
В чем проблема видимости?
Ты все равно можешь послать любое сообщение в любой пид
Тем более, что если ты сам дёрнешь колбэк, то эта функция выполнится в твоём процессе, а не в процессе генсервера
Потому что это чистая функция

Yusup
09.08.2016
11:52:08
ок, я понимаю
но просто зачем показывать наружу то, что нужно только генсерверу

Dmitry
09.08.2016
11:52:42
В ООП нужна иркапсуляция чтобы не поломать state
А тут нету state

Yusup
09.08.2016
11:52:55
ну смотри

Google

Yusup
09.08.2016
11:53:28
тогда зачем в эликсире defp?
например ты пишешь функцию sum(list)
для нее ты делаешь вспомогательную defp _sum(list, acc)
тут имеет смысл использовать инкапсуляцию, так?
потому что внешнему миру не нужно знать о _sum

Dmitry
09.08.2016
11:54:35
Если наиболее просто - то для того чтобы скрывать вспомогательные рекурсивное функции

Yusup
09.08.2016
11:54:39
то же самое и тут
только генсерверу нужно знать о колбеках
внешнему миру даже не нужно знать, что там под капотом GenServer

Dmitry
09.08.2016
11:55:32
В принципе да

Yusup
09.08.2016
11:55:34
мой вопрос - можно ли как-нибудь спрятать эти колбеки от внешнего мира, но оставить их для GenServer?
я думал о том, может быть можно попробовать разбить такой модуль на два: Chat.Server и Chat.ServerApi

Yusup
09.08.2016
11:57:37
но Chat.ServerApi тоже должен быть публичным
я только до супервизоров дошел в книжке вот мне и интересно, может кто в курсе

Dmitry
09.08.2016
11:58:49
Во первых, если ты сам вызовешь колбэк, то он никак не повлияет на сервер потому что это чистая функция
Во вторых, так легче тестировать

Yusup
09.08.2016
11:59:28
давайте тогда все будем делать публичным, так?

Dmitry
09.08.2016
11:59:40
Так тут и так все публично

Yusup
09.08.2016
11:59:50
я понимаю, что ты имеешь в виду, но мне это не кажется правильным

Dmitry
09.08.2016
12:00:04
Просто чтобы в sum и _sum не путаться

Google

Yusup
09.08.2016
12:00:11
с точки зрения дизайна языка - есть defp, который делает приватно

Dmitry
09.08.2016
12:00:12
Делают так

Yusup
09.08.2016
12:00:22
с другой стороны, ты его не везде сможешь юзать
и вся твоя инкапсуляция - это варнинги в коментах о том, что тут у тебя сервер, а там - клиент
а что если ты в handle_cast в базу пишешь?

Dmitry
09.08.2016
12:01:18
Да, согласен
Может быть не чистая
Но если даже твой обработчик приватный, что тебе мешает отправить на пид генсервера сообщение, которое запустит этот обработчик?
Или надо ещё и ящик инкапсулировать - от этого процесса можно сообщения принимать, а от этого нельзя?

Admin
ERROR: S client not available

Dmitry
09.08.2016
12:03:34
Но это не поможет кстати
Надо чтобы сообщения принимались только от тех функций, которые прописаны в определённом модуле.

Yusup
09.08.2016
12:04:35
или как оно там...

Dmitry
09.08.2016
12:04:47
А если так переделать то вообще вся идея корутин полностью поменяется.
Да именно

Yusup
09.08.2016
12:05:07
как бы - ничего не помешает)

Dmitry
09.08.2016
12:05:20
Вот и вся инкапсуляция
)))
Так что смысла что то скрывать нету

Google

Yusup
09.08.2016
12:06:00
это если честно напоминает рефликсию в том же C#
там также есть приватные методы

Dmitry
09.08.2016
12:06:15
Что то скрывают не от дураков а для удобства

Yusup
09.08.2016
12:06:21
и через рефлексию ты можешь дернуть приватный метод
также и тут
скрывают для удобства
а если руками месседж собираешь - то сам себе режиссер
прикол в том, что в C# рефлексия - это последний выбор
также и тут
почему бы не сделать handle_cast приватным?

Dmitry
09.08.2016
12:07:21
Тут точно накосячить нельзя - после 3 минут отп ты уже не вызовешь хендлеры

Yusup
09.08.2016
12:07:32
если нужно прямо вызвать его - ну ок вызывай руками
но просто так ты это не сделаешь

Dmitry
09.08.2016
12:08:11
Handle_cast нельзя сделать приватным потому что его напрямую вызывает другой поток. Напрямую - то есть не очерк другую функцию
Через+

Yusup
09.08.2016
12:08:46

Dmitry
09.08.2016
12:09:05
ну ты нигде в коде не вызываешь эти колючки
Колбэки*

Yusup
09.08.2016
12:09:16
в смысле handle_xxx?

Dmitry
09.08.2016
12:09:19
Да

Yusup
09.08.2016
12:09:28
ну само собой я бы их никогда не стал вызывать))
с другой стороны, мы же в других языках привыкли - все, что не приватное - публичное API. и смысл обозначать публичным то, что по идее тебе не нужно трогать