KeyLocker — это инструмент синхронизации в Go, который позволяет блокировать выполнение потоков, работающих с одним и тем же ключом. Он обеспечивает последовательность операций для одного ключа, одновременно позволяя потокам, использующим разные ключи, работать параллельно.
Такой подход удобен, когда важно избегать конфликтов при доступе к общим ресурсам, связанным с конкретными ключами.
go get github.com/utherbit/keylock
Создание экземпляра KeyLocker
var locker = keylock.NewKeyLocker[int]()
Пример с использованием метода Lock:
func Foo(i int) {
unlock := locker.Lock(i)
defer unlock()
// Do ...
}
Пример с использованием метода Do:
func Foo(i int) {
locker.Do(i, func() {
// Do ...
})
}
Функции Do и Lock выполняют одинаковые действия, разница только в использовании.
Do вызывает unlock автоматический после завершения передаваемой функции.
Lock не создаёт лишней вложенности, в некоторых случаях удобнее использовать, потому что unlock можно вызвать в подходящий момент.
Никогда не вызывайте unlock дважды. Не забывайте вызывать unlock после Lock.
Released under the MIT Licence