@proGO

Страница 131 из 1674
Roman
02.06.2016
14:01:08
анонимные ф-ции не подходят?
так это тоже самое по сути. А вызов более “магический”: <-ch()

[Anonymous]
02.06.2016
14:01:47
так это тоже самое по сути. А вызов более “магический”: <-ch()
вызывай ее после того как получил из канала и нчиего магического не будет

Roman
02.06.2016
14:02:04
кто вам такую чушь сказал?
да, это я глупость сморозил. Но в данном конкретном примере я просто не могу уловить чем два отдельных канала объективно лучше чем вложенный канал?

Артем
02.06.2016
14:04:10
просто я до сих пор не могу уловить причину, по которой из канала нужно принимать канал

Google
Roman
02.06.2016
14:04:10
вызывай ее после того как получил из канала и нчиего магического не будет
Мне тут не нравится потому что в случае двух или вложенного каналов мы работаем только с каналами. А тут с каналом и функцией. Если нет разницы - то лучше работать с более простыми примитивами.

Артем
02.06.2016
14:04:40
вы говорите, что данные должны оказаться в канале ДО запроса

как они там окажутся до?

Roman
02.06.2016
14:05:52
вы говорите, что данные должны оказаться в канале ДО запроса
это опечатка. Я имею в виду следующее. Задача: есть сенсор в отдельном потоке. Мне надо получить его текущее значение. Сенсор - это не просто число, а результат выполнения некоторой функции.

Артем
02.06.2016
14:07:05
функция крутится в цикле?

Roman
02.06.2016
14:07:18
Одним каналом тут не обойтись. Т. к. надо сначала “запустить опрос сенсора” а потом этот результат получить

Артем
02.06.2016
14:07:18
или она в отдельном потоке выполняется только раз

Roman
02.06.2016
14:07:41
Ок, ща попонятнее попробую:

1) “клиент” (горутина) хочет получить значение сенсора 2) есть “сервер” (горутина), который это умеет делать 3) сервер получает значение сенсора запуском некой функции (т. к. нужны вычисления) 4) клиент отправляет запрос серверу 5) сервер вычисляет текущее значение 6) отправляет его клиенту

Поскольку в ch <- f() - f выполнится до разблокировки канала, одним простым chan *SensorData не обойтись.

И тут либо два канала, либо вложенный, либо перекидываться функциями

или она в отдельном потоке выполняется только раз
Я сумел внятно изложить постановку задачи?

Артем
02.06.2016
14:11:45
как выполняется пункт 4?

Google
Roman
02.06.2016
14:13:09
как выполняется пункт 4?
поскольку мы в go - то через каналы. Если вложенным - то пункты 4-6 покрываются data := <-<-sensorChan Если двумя, то in <- bool, data := <-out

Артем
02.06.2016
14:13:37
либоя чего-то не пнимаю, либо вы пишете бред

Roman
02.06.2016
14:13:53
а в чем бредовость?

Артем
02.06.2016
14:14:10
как sensorServer узнает о том, что ему надо начать собирать данные?

Roman
02.06.2016
14:16:16
как sensorServer узнает о том, что ему надо начать собирать данные?
если вложенным: <-<-sensorChan - сервер отправляет нам новый канал. Вычисляет значение. Отправляет его в этот новый канал. Каналы без буферов. если двумя: то сигналом служит пришедший из in сигнал. После вычисления результат пишется в out

Roman
02.06.2016
14:18:17
профит чисто косметический. Одна строчка вместо двух.

Артем
02.06.2016
14:18:50
не, я говорю чем <- <- ch лучше чем <- ch

Roman
02.06.2016
14:18:53
и сигнатура структуры, где объявлены каналы - тоже на одну строчку меньше

Evgenij
02.06.2016
14:19:13
Лучше разделить потоки как выше говорили in out

Артем
02.06.2016
14:19:17
вы подумайте - это же одно и тоже, только с лишними операциями

Roman
02.06.2016
14:20:38
не, я говорю чем <- <- ch лучше чем <- ch
ааа) тем, что если на стороне сервера sensorChan <- calculateData() написать, то сначала вычислится calculateData(), а потом будет ожидание разблокировки. Если серверу не слали запросы час - то данные будут на час устаревшими.

Артем
02.06.2016
14:21:12
а при двух каналах?

почему они будут "свежими"?

Roman
02.06.2016
14:22:59
а при двух каналах?
при двух вычисления начнутся только при разблокировке первого канала: <-in out <- calcData() или (при вложенных): sensorChan <- innerChan innerChan <- calcData()

Артем
02.06.2016
14:24:21
значете, если у вас часами он может висеть в ожидании - зачем вам вообще потоки?

чувствуется некий overengineering

Roman
02.06.2016
14:24:57
значете, если у вас часами он может висеть в ожидании - зачем вам вообще потоки?
Я пишу систему моделирования. У меня “часы” проходят за секунды.

Артем
02.06.2016
14:26:03
так я понял идею

и вот почему я выказываюсь против такого - сколько времени пришлось потратить, чтобы это объяснить

Google
Roman
02.06.2016
14:27:34
Лучше разделить потоки как выше говорили in out
Так я не могу услышать объективного довода, почему это лучше? Профиты вложенности: - одна строчка на получение данных вместо двух - меньше переменных в сигнатуре структуры - лучше масштабируется. In/Out будут нормально работать только пока обработка однопоточная. А вот вложенные можно параллелить - мы гарантируем, что возвращаемый канал соответствует только нашему “запросу”.

и вот почему я выказываюсь против такого - сколько времени пришлось потратить, чтобы это объяснить
большую часть времени, я объяснял не сам подход, а задачу, которую он решает.

Артем
02.06.2016
14:30:48
> @ffloyd мы гарантируем, что возвращаемый канал соответствует только нашему “запросу”. хм, а как это ганарнтруется? если я из 10 горутин спрошу один сервер - он отошлет 10 каналов, и каждый ожидающий получит соврешено случайный ответ

на этом прицнипе держится балансировка через каналы

Roman
02.06.2016
14:32:42
> @ffloyd мы гарантируем, что возвращаемый канал соответствует только нашему “запросу”. хм, а как это ганарнтруется? если я из 10 горутин спрошу один сервер - он отошлет 10 каналов, и каждый ожидающий получит соврешено случайный ответ
С чего это случайный? Либо мы запускаем горутину на каждый запрос, либо используем пул таких горутин. У каждой такой горутины обработчика есть свой личный канал ответа, который не пересекает и входит в гонки с прочими.

Артем
02.06.2016
14:34:59
канал с доступом к серверу один?

Roman
02.06.2016
14:36:32
канал с доступом к серверу один?
канал запросов один. Он возвращает канал ответа. В случае параллельной обработки - каналы ответа могут быть разными. Это как в вебе считай. IP - один, но подключений много.

Вообще go подбешивает что-то. Generics - да кому они нужны? Immutable types - пиши ручками, если надо. И не забывай, что у тебя нет генериков. Но ты не будешь этого делать ибо у тебя нет времени. Зато будешь молиться, чтобы джуниор случайно не начал менять то, что иммутабельно. Pattern matching - не, не слышали. Circular dependecies - запрет на них с одной стороны дисциплинирует, но с другой иногда крайне неудобен. Итерфейсы - да, классно. Но нельзя тип провернуть вспять. Точнее можно, но только через reflection-магию. select на N каналов - ты не хотел прикасаться к reflection? Ха-ха. В языке есть много классного, но вот эти моменты - бесят.

Про кодогенерацию я знаю. Не считаю это решением годным для production.

[Anonymous]
02.06.2016
14:46:06
A JavaScript interpreter in Go https://github.com/robertkrimen/otto

Roman
02.06.2016
14:59:58
Этот язык не для того что ты перечислил а создавать новый джава или с с тремя плюсами в этом смысла нет? имхо
Не, я несмотря на критику, считаю го хорошим. Но вот генерики бы ему не повредили. Не нужно супернаворотов как C++ и тем более Scala. Я просто хочу написать алгоритм для сбалансированного дерева и иметь возможность его использовать с разными типами. Что в этом плохого?

Roman
02.06.2016
15:01:41
Этот язык не для того что ты перечислил а создавать новый джава или с с тремя плюсами в этом смысла нет? имхо
Если забить на pattern matching и circular dependencies и починить оставшиеся пункты - то язык не превратится в Java или очередной Rust. Станет немного сложнее, но зато мощнее. Если в двух словах - видимо go слишком простой на мой вкус)

Артем
02.06.2016
15:02:23
нужны

очень даже

потому что приведение типов очень задалбливает

Roman
02.06.2016
15:03:01
Есть мнение что генерики не нужны
есть мнение, что в умеренных дозах они только полезны)

Evgenij
02.06.2016
15:03:07
Возьми хаскель сделай то что хочешь и через ffi свяжи и дальше наслаждался го?

Артем
02.06.2016
15:03:41
Возьми хаскель сделай то что хочешь и через ffi свяжи и дальше наслаждался го?
чаще всего haskell впсоминают люди, которые на нем не писали

Google
[Anonymous]
02.06.2016
15:05:01
Советую прочитать http://codeblog.shank.in/poor-mans-generics-in-golang/

Evgenij
02.06.2016
15:05:28
Да нет так балуюсь но да там слёзы а вот то что роман хочет мне кажется там просто а даже очень просто

[Anonymous]
02.06.2016
15:06:11
Поэтому я против генериков, просто те кто вкусили этот плод уже не знают как сделать правильно без этого

Или ленятся

Артем
02.06.2016
15:06:20
Советую прочитать http://codeblog.shank.in/poor-mans-generics-in-golang/
v := st.Pop().(MyStruct) // need to convert the interface{} to MyStruct вот эти need to convert по идее очень нужны?

[Anonymous]
02.06.2016
15:06:28
Но отсутствие генериков это плюс имхо

Артем
02.06.2016
15:07:21
и в секции in conlusion

Admin
ERROR: S client not available

Roman
02.06.2016
15:07:26
Но отсутствие генериков это плюс имхо
Это минус, пока нет эффективного механизма решать задачи без них. Решение генерик-задач через reflect - это боль.

Артем
02.06.2016
15:07:55
Но отсутствие генериков это плюс имхо
раз советуешь прочиать - сам прочитал секцию in conlusion?

This leads to decrease in performance. For example a stack of int type was 15 times faster in my personal benchmarks. And thats a lot !

вот это радует

давайте либо дергать типы туда и обратно, либо иметь по 3-4 одинаковых алгоритма

Roman
02.06.2016
15:09:06
Но отсутствие генериков это плюс имхо
Например, было бы ок, если б можно было на уровне compile-time использовать интерфейсы, а не тупо [T], но с возможностью выпилить обратно в исходный тип чем-то простым, например original(variable)

[Anonymous]
02.06.2016
15:10:58
В Go 2 будет вам решение

Roman
02.06.2016
15:11:16
[Anonymous]
02.06.2016
15:11:52
Есть обсуждения на гугл группс и гитхабе)

Просто нельзя взять и просто запилить генерики как в остальных языках

Я все-таки ставлю на то что го взлетит, хотя он и так взлетает

Roman
02.06.2016
15:30:22
Я все-таки ставлю на то что го взлетит, хотя он и так взлетает
Он уже взлетел. Посмтри на докер, на продукты hashicorp и на какой-то бешенный хайп, который порождает монстров вроде beego.

Google
Roman
02.06.2016
15:39:38
почему монстр?
Мое личное мнение: go хорош для микросервисов, обработки логов, аналитики, но не для вещей типа Django/Rails. Хочешь адовое количество запросов обрабатывать и соединения держать - есть Phoenix. Быстро напрототипить, чтобы работало - rails/django. Сайт на пару страниц - тут хоть на lua пиши. Но вот полноценный фреймворк на go - это болезнь.

Denis
02.06.2016
15:41:37
Юзал лично феникс?

Как по перфомансу относительно го?

Артем
02.06.2016
15:42:27
Как по перфомансу относительно го?
все упрется в производительность хранилища и ширину канала

как в go, так и в elixir

Evgenij
02.06.2016
15:42:42
Опять фреймворк комбайн где-то читал го путь обходиться маленькими по возможности либами имхо согласен

Denis
02.06.2016
15:42:59
И трейдофф скорость сервиса / скорость разработки?

В общем у меня есть вопрос, задавал в комьюнити эликисира, толком не ответили

Сек

Roman
02.06.2016
15:47:06
И трейдофф скорость сервиса / скорость разработки?
elixir сложнее go, но мощнее и выразительней erlang. На go может и быстрее прототип напишешь, но вот приложение на elixir/phoenix будет стабильней (иммутабельные типы данных, OTP и супервизоры). Сам в феникс еще не настолько глубоко вник, чтобы найти и прочувствовать его проблемы.

Aleksandr
03.06.2016
06:28:37
А как можно сделать приложение, которое не теряет соединения по http при перезагрузке? Вообще возможно такое?

Phil
03.06.2016
06:49:39
Но зачем?

Aleksandr
03.06.2016
06:49:49
при деплое

Phil
03.06.2016
06:52:10
и? зачем не терять соединения? они атомарны в 144% случаев

Aleksandr
03.06.2016
09:19:47
т.е при убийстве процесса и запуске нового я не потеряю соединения?

Phil
03.06.2016
09:20:11
зачем тебе сохранять их?

Aleksandr
03.06.2016
09:20:46
чтобы обработать каждый запрос

Denis
03.06.2016
09:22:31
https://github.com/facebookgo/grace

Страница 131 из 1674