
Slava
05.02.2017
11:48:38
если вам пришли данные, то надо дополнительную структуру делать, если хотите на основе этих данных что-то дальше пропихивать
нельзя пришедшие данные изменять, это приводит к проблемам и неожиданным последствиям

Daniel
05.02.2017
11:49:20
коллега

Google

Daniel
05.02.2017
11:49:44
Add надо делать ДО запуска горутины
а то он делается асинхронно, и хер пойми когда


Slach
05.02.2017
11:50:57
блин =((( ну что ж за фигня то такая
ну вот я сделал вот так, вызываю Add до spawn ProcessRequest
func (g *GA2ClickHouse) SpawnProcessRequest() {
log.Print("SpawnProcessRequest BEGIN")
g.wg.Add(1)
log.Print("g.wg.Add(1)")
go g.ProcessRequest()
log.Print("SpawnProcessRequest END")
}
func (g *GA2ClickHouse) ProcessRequest() {
log.Print("ProcessRequest BEGIN")
defer func() {
g.wg.Done()
log.Print("ProcessRequest END defer g.wg.Done()")
}()
//... тут всякое
}
// over engineering detected ;)
func (g *GA2ClickHouse) ShutdownCollector() {
log.Println("ShutdownCollector BEGIN")
close(g.buffered_data)
g.wg.Wait()
if g.tsv_file != nil && g.tsv_file.Fd() < math.MaxUint32 && g.writed_rows > 0 {
g.pushDataToProcessDir()
}
if err:=g.geoip.Close(); err != nil {
LogErrorAndExit(err)
}
log.Println("ShutdownCollector END")
}
=(( и блин даже дебагером не подцепиться =(
оно вообще стало виснуть на g.wg.Wait()
в логах выглядит вообще вот так
2017/02/05 15:43:54 SpawnProcessRequest BEGIN
2017/02/05 15:43:54 g.wg.Add(1)
2017/02/05 15:43:54 SpawnProcessRequest END
2017/02/05 15:43:54 b.N=1
2017/02/05 15:43:54 ShutdownCollector BEGIN
2017/02/05 15:43:54 ProcessRequest BEGIN
2017/02/05 15:43:54 ProcessRequest END after channel closed
2017/02/05 15:43:54 ProcessRequest END defer g.wg.Done()
race condition ушли
но и работать перестало =(


Ivan
05.02.2017
12:52:46
А посоветуйте, если кто какими линтерами пользуется для go кода? Развито ли это всякое?

Slava
05.02.2017
12:53:37

Daniel
05.02.2017
12:54:02
что значит - виснуть?

Slach
05.02.2017
12:55:01
ну значит останавливаться и ничего не делать
выглядит по логам так будто ShuwdownCollector застыл на g.wg.Wait()
и ждет сцуко ;(
но я точно знаю что я wg.Add(1)
сделал только в одном месте...
чего ему там еще ждать то

Daniel
05.02.2017
12:55:20
вы, коллега, длаете ли где-нибудь Done()

Slach
05.02.2017
12:56:13
2017/02/05 15:43:54 ProcessRequest END after channel closed
2017/02/05 15:43:54 ProcessRequest END defer g.wg.Done()
да делаю
и оно в логах показывает что делаю
сразу после отрабатывания закрытия канала

Daniel
05.02.2017
12:57:47
правильный паттерн вот такой:
wg.Add(1)
go func() {
funcToBeRun()
wg.Done()
}()

Google

Ivan
05.02.2017
13:02:34

Slach
05.02.2017
13:06:13
почему я не могу внутри funcToBeRun() сделать defer wg.Done() ???? почему это не правильно?
ок... сейчас попробую
я понял
спасибо

Daniel
05.02.2017
13:06:32
можешь

Slach
05.02.2017
13:06:42
так просто нагляднее

Daniel
05.02.2017
13:06:54
просто мой способ идеоматический
ага

Slach
05.02.2017
13:19:06
нет не помогло...
все равно ерунда какая то
что именно ждет wait вообще не ясно
2017/02/05 16:17:11 SpawnProcessRequest BEGIN
2017/02/05 16:17:11 g.wg.Add(1)
2017/02/05 16:17:11 SpawnProcessRequest END
2017/02/05 16:17:11 b.N=1
2017/02/05 16:17:11 ProcessRequest BEGIN
2017/02/05 16:17:11 ShutdownCollector g.wg.Wait() BEGIN
2017/02/05 16:17:11 ProcessRequest END after channel closed
2017/02/05 16:17:11 SpawnProcessRequest END g.wg.Done()

Slava
05.02.2017
13:19:45
выложи куда-то код, иначе мы никогда не угадаем

Slach
05.02.2017
13:21:10
https://bitbucket.org/bloodjazman/ga2clickhouse/src/907c5b377accef93314e6cbd1882279e1091114a/?at=feature%2Fgo-collector

Slava
05.02.2017
13:21:34
а можно поточнее?

Slach
05.02.2017
13:23:34
вот бенчмарк который "подвисает"
https://bitbucket.org/bloodjazman/ga2clickhouse/src/907c5b377accef93314e6cbd1882279e1091114a/src/ga2clickhouse/handlers_web_test.go?at=feature%2Fgo-collector&fileviewer=file-view-default#handlers_web_test.go-41
вот вызов wg.Wait()
https://bitbucket.org/bloodjazman/ga2clickhouse/src/907c5b377accef93314e6cbd1882279e1091114a/src/ga2clickhouse/cli.go?at=feature%2Fgo-collector&fileviewer=file-view-default#cli.go-182
вот вызов wg.Add()
и порождение функции читающей канал через select а также делающий wg.Done() по завершению
https://bitbucket.org/bloodjazman/ga2clickhouse/src/907c5b377accef93314e6cbd1882279e1091114a/src/ga2clickhouse/data_processor.go?at=feature%2Fgo-collector&fileviewer=file-view-default#data_processor.go-14
канал буфферизованый

Peter
05.02.2017
13:24:11
https://github.com/davelondon/jennifer/

Slach
05.02.2017
14:16:49
а то что в sync.Waitgroup нет возможности прочитать counter это типа специально так задумано??

Daniel
05.02.2017
14:16:59
ага
но можно сочинить свой вэйтгруп на атомиках, и в нем сделать что пожелаешь

Slach
05.02.2017
14:25:28
=(( да блин, как то хочется чтобы простые то вещи из коробки работали
а тут мистика какая то...
сделано все "по мануалу" (код с defer в котором wg.Done он в examples в официальной доке лежит)
а оно не работает
при этом суко... буквально с утра таже самая конструкция работала (не работало другое)

Daniel
05.02.2017
14:29:54
нет там мистика

Slach
05.02.2017
14:33:51
а что тогда есть?? через дебагер не подступишься
логи говорят что .Done() вызван
и что Add вызван 1 раз
и вызван ДО Wait
закоментарил вообще этот wg.Wait и бенчмарки заработали
это как вообще ? ;((

Google

Daniel
05.02.2017
14:34:11
коллега
вы написали херовый код
вот и вся мистика

Ivan
05.02.2017
18:46:43

Peter
05.02.2017
19:35:58

Ivan
05.02.2017
19:37:04
Я не смог придумать зачем.

Sander
05.02.2017
20:06:02
Всем привет,
кто что думает, есть ли смысл читать эту книгу разработчику среднего уровня?
https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882

Slach
06.02.2017
06:01:44
Скажите я правильно понимаю что go func() {}
исполняет горутину не сразу в момент вызова, а помещает горутину в FIFO очередь, а дальше если есть свободный Machine (максимум которых указан GOMAXPROCS), то запускает паралельно в момент порождения горутины?
или все таки запуск накопленных горутин и переключение очереди осуществляется при syscall или при работе с каналами?

Mars
06.02.2017
06:02:36
Горутины запускает планировщик, там не FIFO.
Нет гарантии что последовательно объявленные вызову горутин будут так же последовательно вызваны

Slach
06.02.2017
06:04:28
ок. вызваны они будут сразу если есть свободное ядро?

Daniel
06.02.2017
06:50:33
Когда-нибудь

Антон
06.02.2017
07:14:58
добрый день!
подскажите, возможно ли, и если да, то как, создать тип вроде
type Points []Point
и потом, создав переменную такого типа, иметь возможность заполнять этот массив через индексы, то есть:
var test Points
test[0] = ...

Daniel
06.02.2017
07:16:40
Да
А чего не попробовали-то?

Михаил
06.02.2017
07:17:15
ну тут же 344 человека, кто-нибудь да ответил бы, видимо

Антон
06.02.2017
07:17:37
я попробовал

Daniel
06.02.2017
07:17:44
И?

Антон
06.02.2017
07:17:45
получаю ошибку index out of range
или как-то так

Google

Daniel
06.02.2017
07:17:50
А

Zver
06.02.2017
07:18:21
Используй append

Daniel
06.02.2017
07:18:29
То есть - принципиален отказ от append и make?

Zver
06.02.2017
07:18:39
Либо сразу алоцируй все место.

Slach
06.02.2017
07:18:47
=) append или make
сделать надо сначала
http://golang-book.ru/chapter-06-arrays-slices-maps.html
https://github.com/golang/go/wiki/SliceTricks

Daniel
06.02.2017
07:19:02
Тогда - надо map использовать

Zver
06.02.2017
07:19:35
Но Мар будет заметно медленней.

Admin
ERROR: S client not available

Slach
06.02.2017
07:20:05
ээээ... вам шашечки или ехать =) оно заметно медленее будет наверное на сотнях тысяч элементов =)

Daniel
06.02.2017
07:20:09
Топикстартер не говорил, что надо быстро

Антон
06.02.2017
07:22:21
у меня как раз сотни тысяч элементов =(

Zver
06.02.2017
07:23:05
Ну тогда выделяйте мейком место и оперируйте точками. Никаких проблем в этом нет.
Как-то тестировал append, работает достаточно быстро. Почти как предварительное выделение и запись по индексу.

Антон
06.02.2017
07:26:16

Slach
06.02.2017
07:27:09
а про append ты читал?

Daniel
06.02.2017
07:27:22
append расширит массив, если надо

Zver
06.02.2017
07:27:25

Антон
06.02.2017
07:31:11
хмм...понял, спасибо, попробую)

Google

Антон
06.02.2017
07:43:59
вроде разобрался)
всем большое спасибо за помощь!

Михаил
06.02.2017
08:31:53
а кто-нибудь в курсе, как в regexp'ах голанга делать атомарные группировки? (?> ) не поддерживается вроде.

Daniel
06.02.2017
08:38:44
эээ

Mars
06.02.2017
08:50:22

Daniel
06.02.2017
08:50:31
нет
имеется в виду спец-конструкция, которая влияет на глубину отката стека парсера
никогда в жизни ей не пользовался - потому и не знаю, как оно в го

Михаил
06.02.2017
08:53:19
Да вот мне вот понадобилось второй раз в жизни

Daniel
06.02.2017
08:58:21
можно в слаке попробовать спросить
и следующим ходом - в англоязычном листе

?
06.02.2017
09:28:35
имея бинарник проги на го, можно понять, что она написано на го и можно ли ее декомпилить в хоть сколько-то адекватный код? (сорри, если вопрос тупой)
собстно, хочу знать, могу ли дать кому-то бинарник, чтобы у него не было сорцов?

Valery
06.02.2017
09:30:24
Пока что нет декомпиляторов

Daniel
06.02.2017
09:30:31
декомпилится оно в go assembler

Valery
06.02.2017
09:30:38
Ну ладно(

Constantine
06.02.2017
09:30:50
Валера-Валера )

Valery
06.02.2017
09:31:06
Ну все равно это такое

Daniel
06.02.2017
09:31:09
собственно, декомпиляторов я не видал, но создание декомпилятора для го - очень простое дело

?
06.02.2017
09:31:09
а надо знать, что она в принципе на го написана или это можно прочекать?