首页 >后端开发 >Golang >Go中如何获取有期限的锁?

Go中如何获取有期限的锁?

Patricia Arquette
Patricia Arquette原创
2024-10-29 15:22:02649浏览

How to Acquire a Lock with a Deadline in Go?

Go 中通过 Deadline 获取锁

Go 中,sync.Mutex 类型仅提供 Lock() 和 Unlock() 方法。对于应在截止日期内尝试获取锁或可能立即中止的情况,没有内置解决方案。

建议的解决方案:通道作为互斥体

另一种方法是使用缓冲区大小为 1 的通道来模拟互斥体。通过发送和接收单个空结构体值 (struct{}{}),可以执行锁定和解锁操作。

Lock:

<code class="go">l := make(chan struct{}, 1)
l <- struct{}{}</code>

解锁:

<code class="go"><-l</code>

尝试锁定:

<code class="go">select {
case l <- struct{}{}:
    // lock acquired
    <-l
default:
    // lock not acquired
}</code>

尝试超时锁定:

<code class="go">select {
case l <- struct{}{}:
    // lock acquired
    <-l
case <-time.After(time.Minute):
    // lock not acquired
}</code>

在提供的示例中,假设 s.someObj 是从键到值的映射。

示例 1:延迟敏感代码的 LockBefore()

<code class="go">// DoTheThing locks before performing expensive computations.
func (s *RPCService) DoTheThing(ctx context.Context, ...) ... {
    l := make(chan struct{}, 1)
    select {
    case l <- struct{}{}:
        defer <-l
        ... expensive computation based on internal state ...
    default:
        return s.cheapCachedResponse[req.Parameter]
    }
}</code>

示例 2:用于更新统计信息的 TryLock()

<code class="go">// updateObjStats attempts to lock and update stats.
func (s *StatsObject) updateObjStats(key, value interface{}) {
    l := make(chan struct{}, 1)
    select {
    case l <- struct{}{}:
        defer <-l
        ... update stats ...
        ... fill in s.cheapCachedResponse ...
    default:
        // skip locked object
    }
}

// UpdateStats attempts to lock and update stats for all objects.
func (s *StatsObject) UpdateStats() {
    s.someObj.Range(s.updateObjStats)
}</code>

以上是Go中如何获取有期限的锁?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn