🎉
Я просто представляю мапу, как глобальную переменную, разве нельзя их использовать в коде?
Daniel
можно
Daniel
дело не в мапе
Eugene
нужен лок на запись и чтение
Vasily
Я просто представляю мапу, как глобальную переменную, разве нельзя их использовать в коде?
можно до тех пор пока у вас нет вероятности одновременного чтения-записи как только появляется такое повдеение - надо покрывать мютексом
Karey
Я просто представляю мапу, как глобальную переменную, разве нельзя их использовать в коде?
Потому что у тебя горутины читают и пишут из одного и того же куска памяти
Vasily
если бы вы при инициализации программы заполнили мапу единожды, а потом только читали - то без проблем
🎉
нужен лок на запись и чтение
Да это-то понятно, я исхожу из того, что лок там стоит.
Karey
И магически не появится)
Eugene
а если его там нет, то и поведение как его там нет
🎉
но его же там нет
Я набросал условный код, по быстрому что-бы показать, что горутина таким образом может работать, код у меня немножко другой.
Artem
да и смысла паралелить там особого нет, поскольку самое критичное -запросы выполняются последовательно
Kirill
Пайк дал людям unsafe, но всем остальным Вьюков дал atomic.Value
🎉
Просто мне рассказывали, что так работать не может вот и всё.
Eugene
хорошо, изначально был вопрос прочему с мапой работает а со структурой нет, если мне память не изменяет
Daniel
а?!
Daniel
и так, и эдак работает
Daniel
мапа бросит панику, структура нет
Artem
Я набросал условный код, по быстрому что-бы показать, что горутина таким образом может работать, код у меня немножко другой.
вы набросали код, который описали и собственно о чем и речь он не работает :) Ровно как и создание структуры и передача по значению это не то же, что использование make возвращающего ссылку.
Kirill
только вот с мапой хреново работает
Kirill
я бы отобрал и то, и это, кстати
и что бы взамен? я так-то вообще гошку без unsafe плохо представляю, как ты ещё через говны реализации языка переступать будешь? 🙂
Daniel
а вместо них дал бы реентерабельный мьютекс
🎉
Ну ладно, всем спасибо, голова закипела, пойду курить.))))
Artem
мне кажется кому то нужно просто поспать, а на свежую голову все обдумать и написать, а дальше если будут вопросы просто показать код, который работает или нет.
Daniel
и что бы взамен? я так-то вообще гошку без unsafe плохо представляю, как ты ещё через говны реализации языка переступать будешь? 🙂
не буду, зачем через них переступать? помнишь я про unsafe спрашивал? так вот, без всякого unsafe я там 6M/s сообщений парсил на одном ядре.
Kirill
всё хотел спросить)
Daniel
а зачем мне его применять, если и без него хорошо получилось?
Kirill
а, ты тогда нашел всё же вариант без unsafe?
Daniel
кроме того - у меня там zmq был, который через cgo, и в топе был как раз cgo, а не мой парсер.
Daniel
а, ты тогда нашел всё же вариант без unsafe?
да, и очень странный. копирование структур у меня там оказалось быстрее, чем изменение их по указателю. видимо, потому, что реже сбрасывался кеш
Kirill
о как
Kirill
а тачка какая?
Kirill
камушек один или несколько?
Daniel
все в один поток
Kirill
🤔
Daniel
я все думаю, не повторить ли эксперимент
Kirill
интересный момент
Daniel
но опубликовать не выйдет еще три года :)
Kirill
дык можно другой кейс навелосипедить)
Kirill
а потом, по традиции, "у моей сестры есть друг..."))
Daniel
ну. кстати, да
Kirill
можем повторить эксперимент и попробовать разные другие варианты)
Alexander
Тоже почитал комменты выше. Взяли, запинали парня ни за что. Код то в принципе рабочий, если мютекс добавить вокруг чтения и записи в мапу.
Daniel
нет
Daniel
еще две ошибки минимум
Alexander
Только там defer не на месте еще
Alexander
точнее, его надо заменить на явное закрытие в конце цикла
Daniel
или унести в отдельную функцию
Alexander
или так, да
Alexander
а какая еще ошибка? Не вижу
Daniel
1. перед тем, как начинать слушать запросы, надо проинициализировать структуру. позвать course синхронно, например. тут, кстати, окажется, что работу по опросу лучше вынести в отдельную функцию 2. нет никакой гарантии, что обновления курсов usd и eur будут относиться к одному моменту времени.
Kirill
я вообще такие сервисы как делаю
Kirill
прогрев, настройки, подгрузка инфы, _формирование ответа_, запуск горутины с атомарной заменой сформированного ответа и дальше запуск листенера
Kirill
потому что у двух разных людей всё равно один и тот же необходимый контент
Alexander
Согласен с этим. Хотя это всё детали и их необходимость зависит от предполагаемого применения этого сервиса. Если уж придираться, то для начала обработку ошибок внешнего сервиса нужно делать вместо фатала. И это гораздо важнее некого краткого момента, когда программа уже запущена, но первые данные еще не получены. Для почти что первой программы на Го - вполне годно.
Daniel
нет, не годится
Daniel
это ошибка проектирования, а не программирования
Alexander
И еще -The API updates rates daily around 4PM CET every working day
Daniel
говорит о том, что автор вообще не думал, что именно должна делать его программа
Alexander
Усилия должны быть соразмерны требованиям. Не нужно городить трехслойную архитектуру с многократным резервированием и надёжностью в 8 девяток, если это нужно для тебя лично, чтобы пару раз в день смотреть курсы валют в телефоне
Alexander
Следующий раз, или для бОльшей нагрузки посмотри, что выше написали про инициализацию и т.д.
🎉
Вот за дефер, спасибо, об этом не подумал, и возможно мапу на структуру заменю.
Alexander
Если использовать структуру, то мьютекс или атомик всё равно нужно
🎉
Ну да, я понял, спасибо.
🎉
Нашёл таки ошибку: uri := "http://api.wunderground.com/api/" + conf.ApiWundergroundCom + "/conditions/lang:RU/q/Russia/Ryazan.json" так у меня паника, из-за conf.ApiWundergroundCom, до этого я сунул это в кавычки. В принципе и подозревал что в этом месте))
Alexander
Прямо паника? Он неправильного URLа?
Karey
И там у тебя еще в названии переменной была опечатка - currency
🎉
Прямо паника? Он неправильного URLа?
Да. Там зашит ключик, и я когда словил панику, я тупо в кавычки убрал и погнал дальше куролесить, а так как я его экранировал, то запрос был не правильным, и в структуре было пусто. Слабое знание го, ну и perl немного на моск давит.))))