🏳️ Phil
гуглитсо про какой-то race data
Anonymous
Сделай 1 рутину на запись в файл и кидай ей в канал из других горутин, так не будет конкурентной записи в файл, хотя и без неё не должно быть проблем. Ошибка про слайс говорит о проблеме в другом месте
Anonymous
Если где-то идёт параллельная работа со слайсом, то надо ставить локи
Anonymous
ээээ....
Напиши тест, где 100 горутин добавят данные в слайс, и посмотри сколько данных будет в слайсе - не 100
Anonymous
Слайсы не потокобезопасны, хотя ошибки зачастую не видны, в отличие от мап
🏳️ Phil
понял
Anonymous
В свое время гуглил является ли запись в файл в го потокобезопасной, и не нашел ответа. Поэтому предостерегся в виде отдельной рутины, которая пишет. Хотя вроде и из многих рутин тоже ошибок не было и данные не терялись
🏳️ Phil
Ну вот я ресолвинг реестра запрещенных сайтов сделал и он нихрена писаться на 100 горутинах уже отказывается
Anonymous
Как буду у компа, проверю параллельный fprintf
Michael
Чтобы напугать начинающих и позвать к себе, пилить говно на говне
за морями тоже умеют пилить распилы и осваивать бюджеты
Michael
Не, не лучше. Можно опуститься на социальное дно)
когда потом постучат снизу, то поймёте, что жизнь налаживается
Michael
и хоть алкоголик, зато функциональный
dev_sheep
😁
engelbart
А есть у нас что то типа persistent rmq но inprocess? что б ничего не надо было ставить, просто в бинарник включить
Anonymous
HipHop?
Пеашпи хипхоп что ли могет компилироваться в бинарник?
Oleksii
Screenshot (Jun 25, 2017 10:50:13)
Oleksii
Сам не проверял
Oleg
Screenshot (Jun 25, 2017 10:50:13)
#оффтоп а че за ключик у тебя в андроиде сверху, часто его на скринах вижу
Oleksii
ВПН подключен
Oleg
ВПН подключен
ааа, понятн) спасиб)
Nikita
У кого-нибудь был опыт написание апи поддерживающее graphQL на Go?
Anonymous
Проблема. Пишу в файл из 1000 горутин примерно так: if file, err := os.Create("result.lst"); err == nil { defer file.Close() w := bufio.NewWriter(file) ///....... тут 1000 горутин, которые делают строку ниже fmt.Fprintf(w, "%s\n", "blabla") } И у меня через раз внезапно panic: runtime error: slice bounds out of range
Всё ок с параллельной записью в файл: package tests import ( "testing" "fmt" "os" "sync" ) func Test(t *testing.T) { f, err := os.OpenFile( "/tmp/test.log", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0600) if err != nil { t.Error("Cant open file") } defer f.Close() var wg sync.WaitGroup for i := 1; i <= 1000; i ++ { wg.Add(1) go func(i int) { defer wg.Done() f.WriteString(fmt.Sprintf("%d\n", i)) }(i) } wg.Wait() } wc -l /tmp/test.log 1000 /tmp/test.log
Anonymous
а не на их порядок
Anonymous
что при аналогичном конкурентном добавлении данных в слайс, например, без блокировки,не сработает
Valentin
И о каком порядке идёт речь в случае конкурентной записи?)
Anonymous
да я тоже не понял, при чем тут порядок
Michael
поддержу традицию: а причём слайс к файлу?
Anonymous
поддержу традицию: а причём слайс к файлу?
ты читал переписку на сообщение из которой я отвечал? похоже что нет, вот и ответ на 2 твоих вопроса )
Anonymous
чееловек спрашивал почему у него не пишутся данные в файл,. при этом у него была ошибка доступа к слайсу
Anonymous
я проверяю как конкурентную запись файл так и конкурентное добавление в слайс
Michael
в первом случае у него был буферизированный вывод
Michael
во втором нет
Anonymous
Тест конкурентного добавления в слайс: package tests import ( "testing" "sync" ) func Test(t *testing.T) { slice := make([]int, 0) var wg sync.WaitGroup for i := 1; i <= 1000; i ++ { wg.Add(1) go func(i int) { defer wg.Done() slice = append(slice, i) }(i) } wg.Wait() if len(slice) != 1000 { t.Error("Wrong slice length", len(slice)) } } результат: test.go:23: Wrong slice length 837
Michael
и про ядро линукса и в целом пишут такое The kernel does use locking internally to run each read() and write() operation serially.
Michael
не понятно что с чем вы тестируете
Michael
слайсы, файлы, буферезированный вывод
Michael
поэтому кто успел, того и тапки, и ничего удивительного
Anonymous
у меня вопросов никаких нет, я высказал 2 тезиса: - неизвестно как будет работать параллельная запись в файл - параллельноео добавление элементов в слайс очевидно работать не будет
Michael
The kernel does use locking internally to run each read() and write() operation serially. - кто первым встал на запись, то молодец а второе из справки понятно, т.к. никто явно не гарантирует
Anonymous
ок
Anton
Привет всем. Дивный вопрос: есть запущенное консольное приложение ХХХ, можно ли как-то получить данные с него? При этом несколько программ хотят читать вывод с того приложения ХХХ
Valentin
Перенаправление вывода в Linux
Michael
может хотят читать с уже запущенного приложения
Michael
надо уточнить
Michael
а то мало ли
Valentin
Приложение пишет в stdout?
Ilya
я не знаю как это сделать, не предусмотрев inter-process-communication с обоих участников
Пишешь stdout в файл, читаешь другими процессами из файла
Anton
Xxx запускается сторонним приложением. Сам я его не могу запустить
Anton
Так что я не могу перенаправить вывод в файл
Anonymous
перенаправть можно через >
Anonymous
это тут верно пишут
Anonymous
./somescript > somefile
engelbart
А не знаете вот такого же: https://github.com/adam-hanna/golang-vuejs-starter-kit но для vue 2 ?
Anton
Наверное только хукануть если stdout 🤔
Ilya
Внедриться в процесс и сделать все что нужно :)
Valentin
А в чем смысл стартер китов? Берёшь js фреймоврк любой и пишешь rest апи на любом языке
Constantine️
изучать же нужно, а можно хуяк-хуяк и в продакшн
Valentin
Aleksand
Привет всем. Дивный вопрос: есть запущенное консольное приложение ХХХ, можно ли как-то получить данные с него? При этом несколько программ хотят читать вывод с того приложения ХХХ
если речь про Linux то там есть все в файловой системе - /proc/{PID}/fd, оттуда кто угодно может читать весь io любого процесса, при наличии прав конечно, очень и очень удобно на практике, кросс-платформенно будет конечно сложнее, и скорее всего для каждой платформы свой вариант
engelbart
А в чем смысл стартер китов? Берёшь js фреймоврк любой и пишешь rest апи на любом языке
В том что б посмотреть как всё это люди с опытом структурируют например.
Mike
В том что б посмотреть как всё это люди с опытом структурируют например.
идея в том, что у тебя не должно быть завязки фронта на бэк, на бэке просто рест, поэтому организацию стоит смотреть во vue проектах готовых, а не в непонятном бойлерплейте вью + го
engelbart
Приятно наверно быть человеком у которого один правильный ответ на всё. Выключил голову и поехал.
Mike
разные правильные ответы появляются когда ты сам опытный
Mike
а когда нет, смотреть на стартеркиты непонятного происхождения с непонятно зачем закапленностью — ну успехов
Mike
это путь в пхп
Aleksandr
Если ты посмотришь, что в твоём бойлерплейте делает го, то это будут пара строчек запускающих http-сервер
engelbart
Да а кто говорит что вместе. Это вообще тут к чему. У меня например рест и фронт для супермелкого сайта будут в одном репе, что бы не версионировать рест и прочее. Предудыщий бойлерплейт был удобен, что все скрипты были уже описаны. сборки и тестов и прочего. Я помню юзал его, потому и спросил.