Маjко
было бы круто внести синхронизацию в язык, это бы, действительно, помогло. но! они же хотели, чтобы мы вообще мутексами не пользовались, а пользовались другими способами. каналами, к примеру
В джаве она есть, это не сильно помогает. Все равно никаких гарантий, что новый джун не забудет написать кейворд synchronized в critical section
Daniel
пробрасывая immutable data structures?
копию пробрасывая...
Cat
копию пробрасывая...
ну это то же самое в данном контексте (только не иммутабл)
Маjко
Мач перформанс
Daniel
ой, перестаньте
🏁Александр
если сотворили глобальный счетчик какой либо
🏁Александр
да знаю про них
Daniel
ну вот
🏁Александр
они же мьютекс оборачивают?
Daniel
нет, наоборот
Маjко
Daniel
это мутексы сделаны на атомиках
🏁Александр
не знаю
🏁Александр
в кишки не лезу по возможности
🏁Александр
работаю по возможности как с "черным ящиком"
Daniel
а надо бы знать, если на перформанс топить
🏁Александр
обычно перфоманс явно просаживается не на уровне приложения
Маjко
в кишки не лезу по возможности
Это базовые вещи в параллельном программировании, хм.
Daniel
"барьеры памяти" в нем базовые. с тех пор, как в проце есть кеш, и ядер больше одного
heavycharged
копию пробрасывая...
подлянка в том, что даже если саму структуру копировать, то её ссылочные поля передаются по ссылке, и всякие слайсы/мапы тоже, что делает процесс копирования генерацией бойлерплейта
Daniel
на самом деле - это все вопрос дизайна
Daniel
совершенно не обязательно шарить что попало
Daniel
самое неприятное в каналах то, что они медленные
Daniel
правда, узнать об этом можно только в очень специфических случаях
heavycharged
я не сильно компетентен в хайлоаде, но мне кажется, что если каналы стали боттлнеком, то нужно пересмотреть используемые инструменты и подход.
Маjко
самое неприятное в каналах то, что они медленные
Они в го mpmc? (multiple producers, multiple consumers)
Daniel
да
Маjко
Понятно
Daniel
я не сильно компетентен в хайлоаде, но мне кажется, что если каналы стали боттлнеком, то нужно пересмотреть используемые инструменты и подход.
я знаю один способ наткнуться на тормоз каналов - приложение ничего не делает само, а только пересовывает данные из горутины в горутину. например - это какая-то in-memory cache либа. как только мы начинаем делать что-то полезное - полезное начинает занимать на порядки больше времени
Roman
увы, я на такое натыкался =(
Roman
heavycharged
они больно бьют
каким образом больно бьют?
Маjко
Nik
В го есть атомики?
Марина
#вакансия #go #python #ruby #MachineLearning #ML #офис #fulltime Всем привет! 🦋 Кто давно хотел перейти в разработку на Go? 😊 Сейчас именно тот момент! Готовы знакомиться с опытными разработчиками, имеющими разный бекграунд (Python/Ruby/Java) и готовых переходить на Go. О компании: стартап, этап активного формирования команды. О проекте: разработка платформы, позволяющей автоматически создавать решения на базе машинного обучения для бизнеса. Основные задачи: - Создание инфраструктурных решений - Выстраивание архитектуры приложений - Разработка и поддержка микросервисов г. Москва, м. Охотный ряд ЗП: 150 - 250к на руки Фултайм в офисе (Возможность иногда работать удаленно). C подробностями можно ознакомиться здесь: https://vacancy.newhr.ru/golang/4 С радостью отвечу на все вопросы по почте: marina@new.hr 😊 Вакансия представлена агентством https://newhr.ru/ Спасибо!
Roman
каким образом больно бьют?
https://fgiesen.wordpress.com/2014/08/18/atomics-and-contention/
Daniel
многабукв. что там в двух словах? сброс кеша невовремя?
Roman
Это как?
процессоры видят память через кеш. использование атомиков приводит к инвалидации кеш-линии конкретного ядра + в дело включаются алгоритмы когерентности кешей(нам надо эту кеш-линию сбросить у соседних ядер на этом же кристалле, а если сокетов больше одного - то еще и в соседний cpu ннадо)
Daniel
сброс кеша невовремя...
Roman
многабукв. что там в двух словах? сброс кеша невовремя?
инвалидация линейки кеша везде. это дорого. очень.
heavycharged
альтернатив то нет. или есть?
Roman
ну и при contention атомики становятся еще более дорогими
Roman
для понимания ужаса можно посмотреть на http://htor.inf.ethz.ch/publications/img/atomic-bench.pdf
Daniel
но вариантов-то нет, кроме как не пользовать шареную память вообще
Roman
альтернатив то нет. или есть?
нет, да. точнее, атомики плохи при contention. когда несколько потоков используя атомики модифицируют одну и ту же переменную
heavycharged
@pragus спасибо за статью.
Маjко
зависит от сценария использования.
Инкремент из несколькох потоков. Внутри мутекса все равно атомик
Cat
ну и при contention атомики становятся еще более дорогими
дада, дороже чем мьютексы (которые на пару с каналами сделаны поверх атомиков) или каналы + WaitGroup, тоже норм тема
Daniel
и тут мы возвращаемся к вопросу о производительности. запросто на современном проце код с копированием памяти может оказаться быстрее, чем код с передачей указателя и мутексом. если все сойдется так, что копирование произойдет в кеше
Roman
Инкремент из несколькох потоков. Внутри мутекса все равно атомик
да блин, есть же разные варианты реализации мьютексов
Roman
вообще, самый правильный вариант - писать так, чтобы взаимодействия между горутинами/тредами было минимум.
Roman
и не шарить вообще никаких данных
Daniel
данные обычно мутировать не надо.
Roman
если чтения больше чем модификации, оно почти lockless )
Cat
и не шарить вообще никаких данных
"не шарить" в смысле не иметь одновременного доступа к одним и тем же данным? значит нужно передавать данные по каналам? но каналы же медленные?
Маjко
вообще, самый правильный вариант - писать так, чтобы взаимодействия между горутинами/тредами было минимум.
ЕМНИП, в го нет удобных инструментов для организации параллельных вычислений без блокировок совсем. Вроде параллельных итераторов
Daniel
"не шарить" в смысле не иметь одновременного доступа к одним и тем же данным? значит нужно передавать данные по каналам? но каналы же медленные?
еще когда я это написал, я подумал, что будет так. канал медленный по сравнению с мутексом и атомиком. потому, что в нем 3 мутекса, кажется. но! вы об этом никогда не узнаете!!!
Маjко
если чтения больше чем модификации, оно почти lockless )
Я его для эльбруса реализовывал. Там таки спинлок и атомик. Возможно на платформах где есть барьеры памяти оно поэффективнее)
Daniel
конечно. вы и про атомик узнаете только если напишете херню - будете модифицировать счетчик часто и из разных тредов
Roman
Даже не один х)
Вы из мцст?
Маjко
Ага
🐈Сергей
про встраивание мьютекса - не вижу проблем с этим. ну доступны локи снаружи пакета, не критично, иногда даже полезно бывает, т.к. мапа не приватная
ну как угодно 😊 Просто ты предоставляешь лишний интерфейс к компоненту 😊 То есть такого рода компонент должен быть инкапсулирован, за атомарность операций должен отвечать непосредственно публичный метод. По поводу тестов, тестировать нужно все 😊 Даже простые функции, пусть она просто складывает 2 + 2.
heavycharged
По поводу тестов, тестировать нужно все 😊 Даже простые функции, пусть она просто складывает 2 + 2. С этим не соглашусь
Маjко
Человек, возможно, из мира динамической типизиции пришел, где тестировать нужно всё, чтобы не огребать от проблем с типами
Je
Тестировать нужно, но не обязательно писать тесты на такие функции, достаточно, чтобы в покрытие попадала другими более высокоуровневыми тестами
heavycharged
ну обычно тестят внешний API и ещё какие-то сложные функции.