
Slach
26.01.2017
16:54:47
ааа... ну это в доке с примернами... ок. wg.Done внутри замыкания... понял спасибо =)

Daniel
26.01.2017
16:55:16
извините, отвлекся

Semyon
26.01.2017
16:55:30
Но мне, если честно, больше понравилось с фьючами

Google

Semyon
26.01.2017
16:55:45
нет вот этого вот хардкора с подсчётом

Daniel
26.01.2017
16:55:45
фьючи? в го?

Semyon
26.01.2017
16:56:20
фьючи? в го?
ага, это такое модное название для темы, когда ты возвращаешь канал, в который горутина потом что-то напишет
это такая себе фьюча, конечно
но суть примерно та же

Yura
26.01.2017
17:01:28
Future можно реализовать или через WaitGroup, или путём закрытия канала
т.е. значение в сторонке, а броадкаст или через close(chan), или через wg.Done()

Semyon
26.01.2017
17:02:35
ага, понял

Мерлин
26.01.2017
18:14:14

Semyon
26.01.2017
18:15:07
Ну вот у меня задачка была, запустить кучу горутин, подождать, пока они все завершат работу и собрать результаты их выполнения в один слайс

Мерлин
26.01.2017
18:15:47

Google

Semyon
26.01.2017
18:16:21
вейтгрупп как мне поможет результаты собрать?
подождать не проблема, хоть с ним, хоть без

Мерлин
26.01.2017
18:16:27
Не, я понимаю зачем это, я не понимаю, зачем фьючи

Semyon
26.01.2017
18:16:45
ну смотри, я запускаю охулиард горутин, собираю их каналы в слайс
и потом банальный for-loop'ом одновременно жду и получаю результаты
меньше кода
А что ещё важнее — меньше стейта
я тут изо всех сил смиряю плоть и пытаюсь полюбить Го
после кложи и скалы это непросто
О, разу уж тут
А не появилось ли случайно дебаггера отличного от GDB обвешенного скриптами?

Slach
26.01.2017
18:37:49
ну dlv вроде как в golangd встроенный идет
https://github.com/derekparker/delve
и даже работает

Мерлин
26.01.2017
18:38:43

Semyon
26.01.2017
18:39:11
можно, но в таком случае надо заранее знать длину буфера канала
а это опять лишний стейт
я же не могу со стороны последней горутины сделать close(c)
я не знаю когда она там будет

Mars
26.01.2017
18:48:27

Мерлин
26.01.2017
18:54:15

Google

Мерлин
26.01.2017
18:56:56

Semyon
26.01.2017
18:59:55
Давай я поясню, я знаю, что нет проблемы знать, проблема в том, что если чего-то можно не знать, то лучше этого не знать
ну вот такая у меня привычка, как у функциональщика со стажем
Ты лучше скажи, чем плохая идея с "фьючами"?

Мерлин
26.01.2017
19:02:38

Semyon
26.01.2017
19:02:52
results = append(results, <-c)
он ничего не знает о размерах или количестве

Мерлин
26.01.2017
19:04:05

Semyon
26.01.2017
19:04:27
ну вот меня этот вопрос тоже парит

Мерлин
26.01.2017
19:04:30

Semyon
26.01.2017
19:04:40
но да, в принципе засчитано
насколько я понимаю канал сам по себе очень дешевая структура

Мерлин
26.01.2017
19:05:34

Semyon
26.01.2017
19:05:34
и особого смысла на спичках экономить тут нет, но мысль о том, что я аллоцирую кучу каналов и это, наверное, плохо мне приходила

Мерлин
26.01.2017
19:05:46

Semyon
26.01.2017
19:06:00
это да, но не на тех объёмах
у меня тут очень простое приложение, то есть максимум воркеров будет ну десятка три на проход

Google

Мерлин
26.01.2017
19:06:30

Semyon
26.01.2017
19:06:32
мне кажется байтоёбством заниматься на 30 воркерах особого смысла нет

Мерлин
26.01.2017
19:06:40
Просто, имхо, зачем делать как не надо, если можно сделать как надо?

Semyon
26.01.2017
19:07:45
Ну, я вроде попытался объяснить, почему меня беспокоит схема с групвейтом
потому что в простой функции внезапно появляется некий стейт, который нужен только ради синхронизации и больше вообще ни для чего
мне ещё предстоит полюбить стейт, have mercy
пока он меня пугает больше, чем лишние аллокации

Admin
ERROR: S client not available

Мерлин
26.01.2017
19:08:58

Semyon
26.01.2017
19:09:08
ну вот же
это сложно :3
надо мозг
а у меня нет

Мерлин
26.01.2017
19:09:36
Ты ещё видимо с context не сталкивался, вот где весь ужос :3

Semyon
26.01.2017
19:09:41
Пока нет

Мерлин
26.01.2017
19:09:59
Советую ознакомиться, полезная и нужная штука

Semyon
26.01.2017
19:10:10
спасибоньки, гляну

Мерлин
26.01.2017
19:10:38
https://golang.org/pkg/context/
http://telegra.ph/Go-Newsletter-Issue-144-January-26-2017-01-26

Google

Sergey
26.01.2017
19:55:35
Товарищи, подскажите пожалуйста
func main() {
naturals := make(chan int)
squares := make(chan int)
// Counter
go func() {
for x := 0; x < 100; x++ {
naturals <- x
}
close(naturals)
}()
// Squarer
go func() {
for x := range naturals {
squares <- x * x
}
close(squares)
}()
// Printer (in main goroutine)
for x := range squares {
fmt.Println(x)
}
}
вот есть код, горутины с каналами
но ведь он же последовательно выполняется и в данном случае никакой параллельности эе нет
правильно я понимаю?

Phil
26.01.2017
19:57:29
вроде как не правильно

Sergey
26.01.2017
19:59:07
хм....
или как бы устроено следующим образом

Phil
26.01.2017
19:59:24
а с чего он последовательно выполняется

Sergey
26.01.2017
19:59:45
есть горутина1, которая запихивает в канал1 циферьки
и парралельно с ней крутится другая горутина, которая слушает канал1 и только когда в канал1 приходят данные она отрабатывает
так правильнее?

Phil
26.01.2017
20:01:27
ну. так в чем не параллельность? или даже так - а как должна выглядеть параллельность, чтобы сказать: "Вот она!"

Sergey
26.01.2017
20:01:46
не не, неправильности никакой нет. я пытаюсь понять
разобраться

Phil
26.01.2017
20:01:59
Строго говоря, в Го не параллельности. есть конкурентное программирование

Sergey
26.01.2017
20:02:07
смотрю как работают разные проги, экспериментирую и строю гипотезы )

Phil
26.01.2017
20:03:48
А чего строить гипотезы, если вроде как всё ясно описано. "Распараллеливание" сопрограмм через "go чтото". Шедулинг по i/o. Общение через каналы. Всё

Sergey
26.01.2017
20:04:23
ну, это вам всё понятно ? а мне после php не особо понятно

Phil
26.01.2017
20:04:31
Общение в том числе используется как передача и прием управления за счет шедулинга по i/o