Загрузка…
Загрузка…
Go · middle · сложность 5
sync.Map — это специализированная параллельная карта из пакета sync, оптимизированная в первую очередь для рабочих нагрузок с большим количеством операций чтения и сценариев, в которых ключи считываются часто и редко изменяются.
sync.Map:read-part для быстрого чтения, в основном без блокировок;
dirty-part для обновлений и новых записей, находящихся в процессе синхронизации.
Чтение из «горячей» зоны чтения часто обходится без общего мьютекса, который уменьшает раздоры.
Межуровневые записи/продвижения имеют более сложную внутреннюю логику, но нацелены на не наказывать за массовое чтение.
sync.Map может быть быстрее, чем map + mutex:Много операций чтения, мало операций записи (классическая рабочая нагрузка, в основном чтение).
Ключи в основном стабильны, без агрессивных изменений.
Высококонкурентный доступ для чтения из многих горутин.
map + mutex:Записей много или они доминируют.
Требуются сложные инварианты для нескольких ключей.
Безопасность типов важнее (потому что sync.Map работает через any).
Требуется более простая и очевидная логика для поддержки команды.
sync.Map используется во внутренних кэшах и таблицах, где характер доступа близок к интенсивному чтению (в частности, в частях среды выполнения/стандартных пакетов для кэширования метаданных и вспомогательных структур). Ключевая идея везде одна и та же: минимизировать блокировку при массовом чтении.
sync.Map — это не «лучшая карта в целом», а точечный инструмент для конкретного профиля нагрузки. Если у вас есть сценарий, ориентированный преимущественно на чтение, с высоким уровнем параллелизма, это может дать выигрыш; в других случаях простой map + mutex зачастую более прозрачен и эффективен.
sync.Map — это специализированная параллельная карта из пакета sync, оптимизированная в первую очередь для рабочих нагрузок с большим количеством операций чтения и сценариев, в которых ключи считываются часто и редко изменяются.