хэш-таблица golang с поддержкой параллелизма - PullRequest
0 голосов
/ 20 октября 2019

Мне нужно использовать очень большую хэш-таблицу и получать к ней доступ от множества читателей и множества авторов параллельно. существует ли структура данных, такая как map, которая поддерживает много операций чтения и записи параллельно, без блокировки всей структуры при каждом доступе?

Ответы [ 2 ]

2 голосов
/ 20 октября 2019

Поскольку вы запросили карту

без блокировки всей структуры при каждом доступе

Я направляю вас к следующей реализации:

https://github.com/cornelk/hashmap

В этом проекте реализована структура данных чистой хэш-карты без блокировок с использованием атомарных инструкций, распространенных во многих архитектурах ЦП

Обычный go sync.Map все еще использует базовый Mutex, который блокирует соответствующую структуру данных карты.

0 голосов
/ 20 октября 2019

Пакет sync обеспечивает одновременный сейф map .

Карта похожа на интерфейс Go map [interface {}] {}, но безопасна для одновременного использования несколькимиГорутины без дополнительной блокировки или координации. Загрузка, хранение и удаление выполняются в амортизированном постоянном времени.


Хотя сама спецификация указывает на эти два конкретных случая, когда ее следует использовать (в противном случае они предлагают использовать карту нормалей с механизмом блокировки). ):

  1. , когда запись для данного ключа записывается только один раз, но читается много раз, как в кэшах, которые увеличиваются
  2. , когда несколько программ читают, записывают и перезаписывают записи длянепересекающиеся наборы ключей
...