首页 > 后端开发 > Golang > 正文

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

Patricia Arquette
发布: 2024-10-29 15:22:02
原创
591 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板