
Roman
02.06.2016
14:01:08

[Anonymous]
02.06.2016
14:01:47

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

Артем
02.06.2016
14:17:37

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

Артем
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

Evgenij
02.06.2016
14:57:25

Roman
02.06.2016
14:59:58

Roman
02.06.2016
15:01:41

[Anonymous]
02.06.2016
15:02:12

Артем
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

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

[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

Артем
02.06.2016
15:07:55
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

Google

Paul
02.06.2016
15:36:28

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% случаев

Sergei
03.06.2016
06:53:48

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