🎉
@MarlikAlmighty у тебя отладчик есть? ты уверен что ты на самом деле данные пишешь?
Да, уверен. Локально проверил, запуская отдельно файл.
Eugene
@onokonem спасибо, в шарпе более прощающее поведение
🎉
Еще раз. Запусти через go run -race main.go
Да я пока думаю, проверить ещё кое-что, возможно и там накосячил.
Karey
Мы просто всем чатом тебе говорим где ты накосячил)
Artem
Это работает, представляете?
это работает то, что через мапу передавалось? в смысле ту как раз которая совершенно не безопасна?
Daniel
@onokonem спасибо, в шарпе более прощающее поведение
это врядли. дело-то не в языке, а в процессоре
Daniel
Это работает, представляете?
мы не верим, извините
Eugene
это врядли. дело-то не в языке, а в процессоре
тут дело в том что в шарпе чтение/запись атомарны. и максимум последствий - устаревшее значение
🎉
Мы просто всем чатом тебе говорим где ты накосячил)
go run -race main.go config.go db.go weather.go и ничего, даже сервак не пашет.
Daniel
тут дело в том что в шарпе чтение/запись атомарны. и максимум последствий - устаревшее значение
это как это они атомарны? чтобы они были атомарны надо специальные инструкции процессорные использовать. а они не бесплатные. если ими каждое обновление памяти обкладывать - все будет не очень быстро
Artem
Что в ней не безопасного, акромя что она глобально видна?
я просто уточнить хотел вы вот это все сейчас серьезно ?
🎉
мы не верим, извините
Щас соберу эту мысль на плэйголанге.
Karey
Что в ней не безопасного, акромя что она глобально видна?
Почитай пожалуйста про race condition, что это такое, почему происходит, что влечет за собой
Pawel
@onokonem спасибо, в шарпе более прощающее поведение
ага, щаз. Гонка данных в .net к тем же последствиям приводит, что и в С++ - может быть всё что угодно
Karey
Щас соберу эту мысль на плэйголанге.
Не надо, не трать на это время
Daniel
Что в ней не безопасного, акромя что она глобально видна?
при каждом изменении состава ключей мапа может перестроиться. соответственно, указатели будут невалидные, взятые до обновления, что приведет, скорее всего, к general protection fault
🎉
я просто уточнить хотел вы вот это все сейчас серьезно ?
Да, мне нужны аргументы, я только не давно на го переползать начал.
Karey
Ключ один и тот же, не меняется, проблема в чём?
Говорить так плохо конечно, но тебе нужно немного почитать про язык и уложить концепции в голове, потому что на лицо некоторое непонимание базовых вещей
Daniel
при чем тут язык?
Artem
Да, мне нужны аргументы, я только не давно на го переползать начал.
а ну тогда все понятно, в любом другом языке же который поддерживает многопоточность все иначе. А аргументы уважаемый вам даст курс по основам computer science. p.s. и да просто поверьте ваша мапа в гоуртинах не работает. это мираж.. глюк и т.д. :)
Daniel
вот вот
Daniel
неплохо бы представлять себе, что там на процессоре происходит
Karey
Разумеется, но нужно хотя бы уложить в голове что Go это не JS и не Python и здесь не один поток
Daniel
ну приготовьте...
Karey
Работать то он может и работает. Но это как в анекдоте про скорость набора на клавиатуре...
Eugene
ага, щаз. Гонка данных в .net к тем же последствиям приводит, что и в С++ - может быть всё что угодно
не совсем так Reads and writes of the following data types are atomic: bool, char, byte, sbyte, short, ushort, uint, int, float, and reference types. In addition, reads and writes of enum types with an underlying type in the previous list are also atomic. Reads and writes of other types, including long, ulong, double, and decimal, as well as user-defined types, are not guaranteed to be atomic. Aside from the library functions designed for that purpose, there is no guarantee of atomic read-modify-write, such as in the case of increment or decrement.
Daniel
o_O
Eugene
это спека микросфта
Daniel
что, эти типы барьерами памяти обложены?
Eugene
про реализацию там не написано
Daniel
да понятно, что не написано
Daniel
но они одной платформы экосистема, возможно, современная память сама обеспечивает атомарность до 32 бит
Eugene
под платформой имеется ввиду x86?
Daniel
но понятно, что, если барьеров там нет, время, через которое данные обновятся для других ядер, не определено.
Eugene
это очевидно, согласен
Daniel
под платформой имеется ввиду x86?
много жестче, чем x86. даже и не весь amd64 поддерживается
Eugene
честно говоря так глубоко не копал, но вроде они вполне себе работают на армах
🎉
ну приготовьте...
https://play.golang.org/p/Jw9UZXz27Ot
🎉
Vasily
угу, если у вас чтение попадёт на запись - будет паника
Vasily
просто раз в 3 мин у вас такое может случиться
分解物質
"неповторимость Go заключается в том что это язык с gc который не тормозит и не java"
Eugene
главное не ява тут конечно :]
🎉
угу, если у вас чтение попадёт на запись - будет паника
Ну да, тут можно лочить, я пишу только, тестирую.
Daniel
слушаейте, ну это же говнокод, как он есть
Artem
Ну да, тут можно лочить, я пишу только, тестирую.
как можно тестировать абсолютно не предсказуемое поведение. Этот код просто не работает.
Daniel
он работает!
Daniel
просто делает херню
Eugene
если через аб его нагрузить минут на двадцать то может и упасть
Karey
Ну да, тут можно лочить, я пишу только, тестирую.
Тут не можно, а нужно лочить. И в этом месте у программы неопределенное поведение которое трудно назвать "работой"
Daniel
для начала, при достаточно большом потоке на чтение оно будет паниковать раз в 3 минуты
Daniel
обновлять при этом не будет никогда
Daniel
Тут не можно, а нужно лочить. И в этом месте у программы неопределенное поведение которое трудно назвать "работой"
вполне определенное. уже давно мапа при конкурентных чтении-записи сразу бросает панику
Karey
Я имел ввиду неопределенное в том плане что упадет/не упадет
Daniel
упадет! :)
🎉
Это не публичный сервис, лок я поставлю, но вопрос был не про это конечно, вопрос стоял так - Это не может работать.
Karey
Не всегда же)
Eugene
Это не публичный сервис, лок я поставлю, но вопрос был не про это конечно, вопрос стоял так - Это не может работать.
это может работать, но не гарантируется что это БУДЕТ работать при любых условиях
Kirill
Не всегда же)
как это не всегда? %)
Artem
Это не публичный сервис, лок я поставлю, но вопрос был не про это конечно, вопрос стоял так - Это не может работать.
это не есть работающее поведение, поскольку выполнит оно задачу или нет не предсказуемо, с гаррантией можно сказать одно -оно выдаст вам критическую ошибку.
Daniel
Это не публичный сервис, лок я поставлю, но вопрос был не про это конечно, вопрос стоял так - Это не может работать.
а это как определить граничные условия. с моей точки зрения, этот код не работает, а падает.
Karey
как это не всегда? %)
До тех пор пока панику не словит
Kirill
я, конечно, понимаю, что тут разработчик может подпереть костыль в виде Restart=always
Daniel
не может
Kirill
но - зачем вообще это делать так?
Daniel
при достаточно большом потоке даже первое обновление не пройдет
Daniel
в результате на часть запросов будет отвечена пустота, а потом случится паника. курс не отдадут никому и никогда. enjoy
Karey
@MarlikAlmighty И да, предполагаю ты скажешь что проект небольшой, нагрузки не будет. Но мы тут все дружно пытаемся тебе объяснить что твой код некорректен)
🎉
при достаточно большом потоке даже первое обновление не пройдет
Это просто попытка держать в памяти данные, не более того, что-бы не писать их в базу. В крайнем случае вместо курса будут нули.
Daniel
при чем тут база?
Daniel
тут минимум 3 ошибки, и это ошибки архитектуры
Artem
да тут вообще не стоит вопрос работает оно или нет, суть в том, что так делать нельзя никогда, это же как писать против ветра