@proGO

Страница 659 из 1674
Ywein
12.06.2017
16:38:39
@scukonick а чего хитрый? обычный thread safe мап. по моему в разы проще чем прикручивать reddis
у реддиса все же не только in-memory хранилище, он может и persistent storage делать. опять же вопрос производительности, redis очень очень быстрый даже на очень больших обьемах данных. про map я не знаю. интересно было бы сравнить

Eldar
12.06.2017
16:38:41
хотя в некоторых случаях особенно на первых началах от незнания это и недостаток, потому что может получиться не то чего ожидаешь)))

Google
Eldar
12.06.2017
16:39:22
я пришел в многопоточность поле php так что очень мучался и до сих пор не все понимаю))

Kirill
12.06.2017
16:39:28
Так, мнения разделились) Я тоже сначала склонялся к функции которая принимает *io.Reader

Alexey
12.06.2017
16:39:33
func countChar(input io.Reader) (uint64, error)

Ywein
12.06.2017
16:40:00
не знаю спорить что лучше что хуже не в моей компетентности, но перед нодой в го есть 1 сущестнвенное преимущество, это потоки
безусловно. я и говорил - нода это если что-то относительно простое, не нужна производительность и многопоточность.

я пришел в многопоточность поле php так что очень мучался и до сих пор не все понимаю))
честно говоря блокируемый одно-процессный подход в JS на практике куда сложнее многопоточности. в JS чрезвычайно легко убить напрочь производительность сервиса, достаточно одного узкого места - и у тебя ложится весь сайт, потому что пока нода что-то делает - весь мир ждет.

там есть кластеризация конечно, но она помогает ограниченно

Kirill
12.06.2017
16:41:56
func countChar(input io.Reader) (uint64, error)
Да, я так и предполагал, только на выходе map[rune]int

Pawel
12.06.2017
16:42:14
Т.е. сделать функцию, принимающую поток?
имхо это более идеоматично для Гоу. Другой вариант - функция, которая принимает строку - менее общий. Вдруг надо файл обсчитать или какойнибудь хттп-респонс

Alexey
12.06.2017
16:44:48
Норм, спасибо.
А в тестах давать strings.NewReader("blablabla") ей на вход

Kirill
12.06.2017
16:45:05
О, класс)

Google
Kirill
12.06.2017
16:45:13
Я тут уже свой начал пилить

Супер

Pawel
12.06.2017
16:47:20
А чем это лучше варианта с передачей *io.Reader?
так я и говорю, что надо io.Reader, только без *, указатель на интерфейс не комильфо. Другой вариант - string или []byte - хуже

Alexey
12.06.2017
16:48:11
Указатель на интерфейс вроде даже не скомпилируется..

Kirill
12.06.2017
16:48:46
Его же возвращает bufio.NewReader()

Alexey
12.06.2017
16:49:27
А, ок. Благодарю. А почему указатель не комильфо?
функция, которая принимает, io.Reader, уже принимает указатели на структуры, которые его реализуют.

Pawel
12.06.2017
16:49:44
Ну если ТТЛ надо, то уже всё сразу становится интереснее
честно говоря особо проблем не вижу с этим, если правильно тебя понял. добавить всякие там временные метки - делов то)

Alexey
12.06.2017
16:50:22
Его же возвращает bufio.NewReader()
Он возвращает указатель на структуру. Его надо давать туда, где принимается просто io.Reader

честно говоря особо проблем не вижу с этим, если правильно тебя понял. добавить всякие там временные метки - делов то)
Ну, чтоб память не разрасталась. Решали проблему так - на каждый value запускали goroutine с таймаутом, которая его удаляла по истечении. На малых объемах всё ок. Для нашего юзкейса, а то так старая горутина удалит новое значение, если оно такое же будет.

Sergey
12.06.2017
16:59:12
Привет ребят! Не подскажите хороший способ заменить один из стандартных пакетов, своим? Например debug/elf заменить полностью своей реализацией. Пробовал положить копию debug/elf в GOPATH, но все равно используется старый.

Kirill
12.06.2017
17:00:01


И да, приходится уточнять тип аргумента до *bufio.Reader, потому что в обычном io.Reader нет функции ReadRune().

Alexey
12.06.2017
17:01:00
Покажи CharCount определение:)

Kirill
12.06.2017
17:01:37


Alexey
12.06.2017
17:01:45
bufio.Reader - это структура io.Reader - интерфейс

тебе надо в функцию передавать (in io.Reader) А внутри делать r := bufio.NewReader(in)

Google
Kirill
12.06.2017
17:02:35
Хм...

Не знал что так можно)

Alexey
12.06.2017
17:03:00
И тогда в функцию можно передавать всё, что реализует io.Reader (а его всё нужное реализует)

Т.е. туда можно будет передавать строчные ридеры, байтовые ридеры, тело ответа http и так далее.

Kirill
12.06.2017
17:03:41
Да, это оно, огонь

bufio.Reader - это структура io.Reader - интерфейс
Отлично, все встало на свои места)

Pawel
12.06.2017
17:06:39
Kirill
12.06.2017
19:22:27
Функция, возвращающая три значения в качестве результата - это нормально, или лучше в этом случае использовать структуру?

Pawel
12.06.2017
19:37:17
а какие 3 типа она возвращает? обычно всё же два значения. первое - результат. воторое - error или bool

Kirill
12.06.2017
19:39:03
а какие 3 типа она возвращает? обычно всё же два значения. первое - результат. воторое - error или bool
В моем примере мапу символ => кол-во вхождений, длину строки в utf8 и кол-во невалидных символов

Kirill
12.06.2017
19:40:03
Ну, питон это питон. Но выглядит так, что тут эти три значения к месту.

Ywein
12.06.2017
19:40:20
Если они всегда вместе можно и стракт

А так не вижу ничего ужасного в 3 возвращаемых значениях

Pawel
12.06.2017
19:40:57
получается просто 3 инта. я бы всё же struct сделал. так проще потом понять ху из ху

ну и есть ещё момент - из канала/в канал ты 3 инта ни как не впихнёшь

а так конечно ничего ужасного нет в 3 значениях

Kirill
12.06.2017
19:46:00
получается просто 3 инта. я бы всё же struct сделал. так проще потом понять ху из ху
А, я дезинформировал немного. Там получается мапа, слайс и инт

Против структуры следующие аргументы: - она едва ли где-то будет использоваться(во всяком случае в текущей реализации программы) - два из трех результатов зачастую опускаются

Google
Kirill
12.06.2017
19:48:01
Хотя зависит конечно от юзкейза

Pawel
12.06.2017
19:50:14
поскольку все 3 типа разные, попутать их нельзя, через каналы они не проходят и в другой package не идут - лучше 3 значения.

Subbotin
13.06.2017
09:32:17
это вопрос к самой SQLite https://sqlite.org/threadsafe.html
ну вот. вроде собирается он потокобезопасным. и даже в коде есть вот такая проверка. func (d *SQLiteDriver) Open(dsn string) (driver.Conn, error) { if C.sqlite3_threadsafe() == 0 { return nil, errors.New("sqlite library was not compiled for thread-safe operation") } но сука базу корёжит при паралельной записи

Oleg
13.06.2017
10:58:18
без регистрации и смс?

Maxim
13.06.2017
11:06:17
Что скажете?

Admin
ERROR: S client not available

Maxim
13.06.2017
11:06:17
Теория современного Go ? перевод ? Хабрахабр:  Go tl;dr магия это плохо; глобальные состояние это магия → глобальные переменные в пакетах это плохо; функция init() не нужна Самое главное и лучшее свойство Go это то, что он, по-сути, антимагический. Не считая пары исключений, простое чтение Go кода не оставляет двусмысленности в определениях, зависимостях или поведении рантайма. Это делает Go относительно легким для чтения, что, в свою очередь, делает его легким для поддерживания, что является самым главным свойством в индустриальном программировании. Но всё же есть пару мест, где магия может просочиться. Один из, к сожалению, распространённых путей это использование глобального состояния. Объекты, определенные в глобальном пространстве пакета могут хранить ... Автор оригинала: Peter Bourgon Читать далее ➡ https://shbr.xyz/hh330786

Aleksandr
13.06.2017
11:09:13
Теория современного Go ? перевод ? Хабрахабр:  Go tl;dr магия это плохо; глобальные состояние это магия → глобальные переменные в пакетах это плохо; функция init() не нужна Самое главное и лучшее свойство Go это то, что он, по-сути, антимагический. Не считая пары исключений, простое чтение Go кода не оставляет двусмысленности в определениях, зависимостях или поведении рантайма. Это делает Go относительно легким для чтения, что, в свою очередь, делает его легким для поддерживания, что является самым главным свойством в индустриальном программировании. Но всё же есть пару мест, где магия может просочиться. Один из, к сожалению, распространённых путей это использование глобального состояния. Объекты, определенные в глобальном пространстве пакета могут хранить ... Автор оригинала: Peter Bourgon Читать далее ➡ https://shbr.xyz/hh330786
все верно в целом

Michael
13.06.2017
11:34:36
что ты делаешь в коде?

Теория современного Go ? перевод ? Хабрахабр:  Go tl;dr магия это плохо; глобальные состояние это магия → глобальные переменные в пакетах это плохо; функция init() не нужна Самое главное и лучшее свойство Go это то, что он, по-сути, антимагический. Не считая пары исключений, простое чтение Go кода не оставляет двусмысленности в определениях, зависимостях или поведении рантайма. Это делает Go относительно легким для чтения, что, в свою очередь, делает его легким для поддерживания, что является самым главным свойством в индустриальном программировании. Но всё же есть пару мест, где магия может просочиться. Один из, к сожалению, распространённых путей это использование глобального состояния. Объекты, определенные в глобальном пространстве пакета могут хранить ... Автор оригинала: Peter Bourgon Читать далее ➡ https://shbr.xyz/hh330786
ага, верно про Init & Global state цитата из оф доков To import a package solely for its side-effects (initialization), use the blank identifier as explicit package name: import _ "lib/math" Хочь побочные эффекты - используй, не хочешь - не используй тут тоже кмк всё нормально смотрится

Subbotin
13.06.2017
11:38:50
ну обычный http сервер на фреймворке echo

Michael
13.06.2017
11:39:16
ну обычный http сервер на фреймворке echo
как объект подключения используешь?

одно подключение на все-все потоки-рутины?

Subbotin
13.06.2017
11:40:25
ну да

я всегда думал, что фраза Type DB is a database handle representing a pool of zero or more underlying connections. It's safe for concurrent use by multiple goroutines. значит, что так можно делать

Alexey
13.06.2017
11:43:16
Теория современного Go ? перевод ? Хабрахабр:  Go tl;dr магия это плохо; глобальные состояние это магия → глобальные переменные в пакетах это плохо; функция init() не нужна Самое главное и лучшее свойство Go это то, что он, по-сути, антимагический. Не считая пары исключений, простое чтение Go кода не оставляет двусмысленности в определениях, зависимостях или поведении рантайма. Это делает Go относительно легким для чтения, что, в свою очередь, делает его легким для поддерживания, что является самым главным свойством в индустриальном программировании. Но всё же есть пару мест, где магия может просочиться. Один из, к сожалению, распространённых путей это использование глобального состояния. Объекты, определенные в глобальном пространстве пакета могут хранить ... Автор оригинала: Peter Bourgon Читать далее ➡ https://shbr.xyz/hh330786
У чувака NewObject ходит в базу. Дальше не читал.

Oleh
13.06.2017
11:44:45
?

Alexey
13.06.2017
11:45:30
я всегда думал, что фраза Type DB is a database handle representing a pool of zero or more underlying connections. It's safe for concurrent use by multiple goroutines. значит, что так можно делать
Так DB как структура потокбезопасная, у тебя ж Go на потоконебезопасность не ругается(а он это отлавливает), это база небезопасная:)

Google
Subbotin
13.06.2017
11:46:58
и че? делать mutex на insert и update?

Oleh
13.06.2017
11:48:53
sqlite юзаешь?

если да, то используй gorm у меня проблем не было

Michael
13.06.2017
11:49:32
и че? делать mutex на insert и update?
ограничиваешт размер пула?

Alexey
13.06.2017
11:49:32
и че? делать mutex на insert и update?
https://sqlite.org/threadsafe.html - вот они пишут, что надо компилировать его так, чтоб безопасно было. А вот как - я хз:)

Oleh
13.06.2017
11:50:26
если да, то используй gorm у меня проблем не было
правда использовал mysql скачаный через apt-get

Michael
13.06.2017
11:51:20
и че? делать mutex на insert и update?
этот метод где-то вызывается? https://golang.org/src/database/sql/sql.go?s=19445:19481#L697

Alexey
13.06.2017
11:51:48
Ну тогда magic :-/

Michael
13.06.2017
11:51:59
не, до магии далеко

пул подключений ограничивается каким либо значением?

Subbotin
13.06.2017
11:52:36
поставить еденичку предлагаешь?

Michael
13.06.2017
11:53:18
резонно проверить я б начал с 10

просто цифра хорошая

Kirill
13.06.2017
11:54:43
ну вот вроде флаг есть
Мб -DSQLITE_THREADSAFE=1 ?

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