Documentation
¶
Overview ¶
Package concurrency 키(Key) 기반의 세분화된 락킹(Fine-grained Locking) 등 고효율 동시성 제어 유틸리티를 제공합니다.
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type KeyedMutex ¶
type KeyedMutex[T comparable] struct { // contains filtered or unexported fields }
KeyedMutex는 키(Key)를 기반으로 세분화된 락(Fine-grained Locking)을 제공하는 구조체입니다.
전역 락(Global Lock) 대신 키별로 독립적인 락을 생성하여, 서로 다른 키에 대한 작업이 병렬로 처리될 수 있도록 동시성 성능을 극대화합니다. 단, 동일한 키에 대한 접근은 안전하게 직렬화됩니다.
내부적으로 참조 카운팅(Reference Counting) 기법을 사용하여, 락이 필요한 시점에만 리소스를 할당하고 사용이 끝나면 자동으로 메모리를 정리하여 리소스를 효율적으로 관리합니다.
func NewKeyedMutex ¶
func NewKeyedMutex[T comparable]() *KeyedMutex[T]
NewKeyedMutex 새로운 KeyedMutex 인스턴스를 생성합니다.
func (*KeyedMutex[T]) Len ¶ added in v1.1.0
func (km *KeyedMutex[T]) Len() int
Len 현재 활성화된(락이 잡혀있거나 대기 중인) 키의 개수를 반환합니다.
func (*KeyedMutex[T]) Lock ¶
func (km *KeyedMutex[T]) Lock(key T)
Lock 지정된 키에 대한 락을 획득합니다.
Example ¶
km := NewKeyedMutex[string]()
var wg sync.WaitGroup
// 상황: 여러 고루틴이 서로 다른 쇼핑몰의 상품 가격을 업데이트합니다.
products := []string{"product-A", "product-B", "product-A"}
for _, p := range products {
wg.Add(1)
go func(productID string) {
defer wg.Done()
// 상품 ID별로 락을 획득합니다.
// "product-A"에 대한 작업은 순차적으로 실행되지만,
// "product-B"는 "product-A"와 병렬로 실행될 수 있습니다.
km.Lock(productID)
defer km.Unlock(productID)
// Critical Section: 가격 업데이트 로직 수행
}(p)
}
wg.Wait()
fmt.Println("All product prices updated.")
Output: All product prices updated.
func (*KeyedMutex[T]) TryLock ¶ added in v1.1.0
func (km *KeyedMutex[T]) TryLock(key T) bool
TryLock 지정된 키에 대한 락을 시도합니다. 락을 획득하면 true를, 이미 다른 고루틴이 락을 소유하고 있으면 대기하지 않고 false를 반환합니다.
성공(true) 시: 반드시 Unlock을 호출하여 락을 해제해야 합니다. 실패(false) 시: 아무런 작업도 수행하지 않으며, Unlock을 호출해서는 안 됩니다.
Example ¶
km := NewKeyedMutex[string]()
key := "hot-deal-item"
// 첫 번째 고루틴이 락을 잡습니다.
km.Lock(key)
// 두 번째 고루틴이 락 획득을 시도합니다.
if km.TryLock(key) {
fmt.Println("Acquired lock!")
km.Unlock(key)
} else {
fmt.Println("Failed to acquire lock, skipping task.")
}
km.Unlock(key)
Output: Failed to acquire lock, skipping task.
func (*KeyedMutex[T]) Unlock ¶
func (km *KeyedMutex[T]) Unlock(key T)
Unlock 지정된 키에 대한 락을 해제합니다. 주의: 반드시 Lock을 호출한 후에 호출해야 합니다. 락이 걸려있지 않은 키에 대해 Unlock을 호출하면 런타임 패닉이 발생합니다.
func (*KeyedMutex[T]) WithLock ¶ added in v1.1.0
func (km *KeyedMutex[T]) WithLock(key T, action func() error) error
WithLock 지정된 키에 대해 Lock을 획득하고 에러를 반환할 수 있는 함수(action)를 실행한 뒤 자동으로 Unlock 합니다.
Example ¶
km := NewKeyedMutex[int]()
key := 12345
// WithLock 헬퍼 함수를 사용하여 Lock/Unlock을 안전하게 관리
_ = km.WithLock(key, func() error {
fmt.Printf("Critical section execution for key %d\n", key)
return nil
})
Output: Critical section execution for key 12345