@proGO

Страница 370 из 1674
Roman
27.12.2016
23:49:20
strings.Contains норм

bufio используешь?

Ivan
27.12.2016
23:50:50
Google
Ivan
27.12.2016
23:50:56
И не помню почему уже)

Roman
27.12.2016
23:52:48
reader := bufio.NewScanner(f) for reader.Scan() { line := reader.Text() if strings.Contains(line,"Bla-bla-text") { ...

Ivan
27.12.2016
23:53:20
strings.Contains норм
Есть более менее идея как горутины прикрутить внутри for? Про каналы выше вон говорили, это единственная возможность наверное, чтобы всё в кучу не перемешать.

Roman
27.12.2016
23:53:35
Вот этот код херачит данные с диска со скоростью программ C

Ivan
27.12.2016
23:54:12
reader := bufio.NewScanner(f) for reader.Scan() { line := reader.Text() if strings.Contains(line,"Bla-bla-text") { ...
Удобно выглядит. Ибо я монстра на ~192 строки написал)

Roman
27.12.2016
23:55:38
При использовани strings.Contains у меня упирается в disck I/O и нет смысла в горутинах

Удобно выглядит. Ибо я монстра на ~192 строки написал)
Ты перепиши для начала, потому что bufio раельно хорошо оптимизирован.

Ivan
27.12.2016
23:57:49
При использовани strings.Contains у меня упирается в disck I/O и нет смысла в горутинах
А у меня всё в памяти висит, т.к. её хватает и файлы не по несколько гигов. В идеале конечно надо ограничитель выставлять, но большинство забивают)

Ты перепиши для начала, потому что bufio раельно хорошо оптимизирован.
Да, меня прям заинтересовало, выглядит проще и логичней.

Roman
27.12.2016
23:58:35
Потом подключи pprof - посмотришь какая функция выжирает и смотри что моно сделать

Ivan
28.12.2016
00:03:45
Потом подключи pprof - посмотришь какая функция выжирает и смотри что моно сделать
Вопрос немного не в тему: какой самой простой задачей можно загрузить на 100% один поток? Что бы по вычислять такое?

Roman
28.12.2016
00:06:35
Ну вот запусти: https://gist.github.com/begetan/1a6dab06082e41da4fe493fb43aaba5e

У гиста имя неправильное, там Go :)

Google
Ivan
28.12.2016
00:15:47
Ну вот запусти: https://gist.github.com/begetan/1a6dab06082e41da4fe493fb43aaba5e
Псевдорандом, точно, помню ты сравнивал скорость выполнения с питоном/джавой и чем то ещё.

Ты перепиши для начала, потому что bufio раельно хорошо оптимизирован.
Бегло пробежался с тестами, 15-25% вроде выигрыш. Надо попробовать полноценно заменить, как бы нормальная разница выходит.

Что-то у меня Го юзает всего 1 ядро. Причём судя по утилитке ниже, он видит 4. Принудительно runtime.GOMAXPROCS(4) не помогает. Куда копать? Пока грешу на компилятор. https://gist.github.com/peterhellberg/5848304
Го может только 36 потоков генерить на машинке с 8 процессорами. Причём на соседней тачке, где 2 проца, всё отлично, 16 потоков видит. Баг/фича/кривая архитектура у железяки?

Как количество потоков считается - в цитате.

Го может только 36 потоков генерить на машинке с 8 процессорами. Причём на соседней тачке, где 2 проца, всё отлично, 16 потоков видит. Баг/фича/кривая архитектура у железяки?
О, а сейчас 54 нашлось, внезапно. Думаю дело в железке, как показывает "есть чо", хотя не должны спать ресурсы по идее.

Roman
28.12.2016
01:38:11
Дело просто в винде :)

Ivan
28.12.2016
04:20:37
Итак. bufio на большом файле показал себя на ~26% лучше чем обработка по строкам из буффера после io/os. На самом деле в ходе тестов было и так видно, что будет примерно такой результат. Почему? Всё просто, bufio читерил) Периодически он себе создавал ещё поток для обработки, что давало +~10% загрузки CPU и естественно эффективность росла.

Уж не знаю, как так можно линейно считывать строки и при этом умудряться заюзать дополнителый поток, но те кто написал bufio видать что-то придумали хитрое.

Ivan
28.12.2016
05:07:07
Какая функция bufio используется?
bufio.NewScanner. Там выше Роман кусок выложил в 2:52 сегодня. Я его и не менял практически у себя.

Alexey
28.12.2016
05:09:57
bufio.NewScanner. Там выше Роман кусок выложил в 2:52 сегодня. Я его и не менял практически у себя.
Именно он никаких потоков не создает: https://golang.org/src/bufio/scan.go?s=5433:5462#L118 Не очень верю, что он там как-то это распараллеливает, хотя под виндой всякое бывает, конечно:)

Ivan
28.12.2016
05:14:00
Именно он никаких потоков не создает: https://golang.org/src/bufio/scan.go?s=5433:5462#L118 Не очень верю, что он там как-то это распараллеливает, хотя под виндой всякое бывает, конечно:)
Я по процессу смотрел, когда почуял странное. Обычно 6 потоков, с bufio порой 7 (эти потоки хз как считаются самой ОС). Да и странно, когда 1(?!) горутина смогла загрузить проц на 35% (4 ядра, логично было бы что выше 25% не подняться).

Petr
28.12.2016
05:39:17
Я почитал про многопоточность в Го но там на примере веб сервера, как бы Го создаёт новый поток для клиента при подключении. А как мне функцию запустить в многопоточности?

Denis
28.12.2016
05:40:22
go myFunc()

Petr
28.12.2016
05:48:53
В отдельном потоке функ запустить а сама дальше пойдёт?

Denis
28.12.2016
06:15:39
дальше планировщик растасует по тредам

Артур
28.12.2016
10:28:53
Подскажите, как наиболее правильно сматчить вложенный json в плоскую структуру? jsonStr := ‘ { “services”: { “app”: { “backends”: [“::1:9051”, “::1:9050”], “balance”: “source” }, “db”: { “backends”: [“::1:5432”, “::1:5433”], “balance”: “roundrobin” } } } ‘ type Settings struct { BackendsMap map[string][]string BalanceTypeMap map[string]string }

Sergey
28.12.2016
10:58:32
ну можно сматчить на неплоскую структуру, а потом пробежаться и в нужную переложить

Google
Артур
28.12.2016
11:46:31
type ServiceConfig struct { Backends []string `json:"backends"` Balance string `json:"balance"` } type Config struct { Services map[string]ServiceConfig `json:"services"` }
Спасибо, но это немножко не то. Уровень вложенности сохранятся. Чтобы добраться, например, до Balance одного из сервисов, надо будет выстроить такую цепочку: config.Services[“app”].Balance. А хотелось бы все сплющить, чтобы было можно делать так: config.BalanceMap[“app”].

Славик
28.12.2016
14:37:58
а чего это в го не работает type switch для структур?

и что нужно сделать со структурой, чтобы заработало?

Daniel
28.12.2016
14:43:53
все работает

Maxim
28.12.2016
14:46:14
Кто работал с вебсокетами гориллы?

Daniel
28.12.2016
14:46:34
иа

corpix
28.12.2016
14:47:40
Max
28.12.2016
14:49:48
Всем привет. Практикующие гоферы, подскажите, Джин (Gin) имеет смысл изучать или он не слишком популярен? А то у меня на нем rest api почти дописан, может чего нибудь более мейнстримное взять?

Max
28.12.2016
14:50:53
Vladislav
28.12.2016
14:50:54
лучше всего давать ссылку через play.golang.org

Vladislav
28.12.2016
14:51:35
Это фан ) Не рабочий проект
допили и выпусти в opensource например, а потом уже пили другое, если будет желание...

не стоит бросать по середине, это очень плохая практика, которая превращается во вредную привычку

corpix
28.12.2016
14:52:13
Такое только через reflect. Type assertion работает только "на уровне интерфейсов", о чем и говорит компилятор в своей ошибке

Max
28.12.2016
14:52:48
не стоит бросать по середине, это очень плохая практика, которая превращается во вредную привычку
Хорошая мысль, спасибо. Но вопрос про джин все еще актуален ) Менять на этом проекте я его уже пожалуй не стану

Daniel
28.12.2016
14:53:43
Такое только через reflect. Type assertion работает только "на уровне интерфейсов", о чем и говорит компилятор в своей ошибке
на самом деле компилятор имеет в виду, что это рботает только с именованными типами

Daniel
28.12.2016
14:57:24
ну - сам компилятор тоже выразился плохо

Maxim
28.12.2016
14:57:49
Самое забавное, если я отправляю длиннющщую строку с подстановкой данных через fmt.Sprintf(), то работает.

Google
Daniel
28.12.2016
14:59:43
в пакете websocket есть константы для типов сообщений. пользуйтесь ими

Daniel
28.12.2016
15:05:30
значит, это не валидный id

Maxim
28.12.2016
15:12:10
Daniel
28.12.2016
15:12:41
а в штатном вебсокете что на этом месте?

Admin
ERROR: S client not available

Maxim
28.12.2016
15:14:26
а в штатном вебсокете что на этом месте?
В смысле, в пакете "из коробки"?

Daniel
28.12.2016
15:16:14
именно

то есть 5 - это не для вас

corpix
28.12.2016
15:20:27
Ещё пожет быть полезно https://tools.ietf.org/html/rfc6455#section-5.5

Maxim
28.12.2016
15:22:04
то есть 5 - это не для вас
А что тогда для меня? Я не понимаю. ?

Зачем в доках тогда прописали что идёт в 5::?

Daniel
28.12.2016
15:23:21
это в каких доках?

А что тогда для меня? Я не понимаю. ?
вот что есть в константах - то и используйте. остальное, я так понял, вполне служебное.

Славик
28.12.2016
17:07:20
Такое только через reflect. Type assertion работает только "на уровне интерфейсов", о чем и говорит компилятор в своей ошибке
а можно для тех, кто прочитал несколько туториалов, но всё равно не понял, в чем разница между интерфейсом и структурой?

Denis
28.12.2016
17:09:43
видел когда-нибудь детскую игрушку-коробку с вырезами определенной формы, в которую нужно пихать квадраты, треугольники и тд?

квадратный вырез это интерфейс

сам квадрат - структура

:)

Славик
28.12.2016
17:11:20
видать я не играл в такую =\

Google
Andrey
28.12.2016
17:11:53
тогда вспомни фильм Идиотократия, там большинство людей не понимают интерфейсы

Denis
28.12.2016
17:13:54
интерфес "квадрат" говорит, что структура должна иметь квадратную форму, 4 угла, все стороны равны, ничего другого она не примет

интерфес это соглашение на предоставление некоторой функциональности

Phil
28.12.2016
17:14:59
интерфес "квадрат" говорит, что структура должна иметь квадратную форму, 4 угла, все стороны равны, ничего другого она не примет
хммм... интерфейс квадрат - это каретка у велосипедов. еще бывает окталинк и еще чтото

Denis
28.12.2016
17:16:46
да, все это интерфейсы

Alexey
28.12.2016
17:27:10
а можно для тех, кто прочитал несколько туториалов, но всё равно не понял, в чем разница между интерфейсом и структурой?
Еее, аналогии. Уметь ходить - это интерфейс. Любая структура (тип животного), которая умеет ходить, удовлетворяет этому интерфейсу. Человек умеет, собака умеет, змея не оч.

Тех, кто умеет, можно передать в функцию, которая заставит их ходить

Славик
28.12.2016
17:28:24
о, понятнее

но это понимание не дало понимания, почему switch type не определяет структуру

Славик
28.12.2016
17:29:31
type SomeStruct struct{...} ?

Daniel
28.12.2016
17:30:22
Да

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