小编A C*_*rse的帖子

试图在golang截止日期之前获得一把锁?

如何立即尝试仅获取一个类似于互斥锁的锁,要么立即中止操作(如TryLock在其他实现中所做的那样),要么观察某种形式的期限(基本上是LockBefore)?

我现在可以想到2种情况,这将对您大有帮助,并且我正在寻找某种解决方案。第一个是:占用大量CPU的服务,该服务接收对延迟敏感的请求(例如,Web服务)。在这种情况下,您可能想要执行类似下面的RPCService示例的操作。可以将其实现为工作队列(带有通道和填充),但是在这种情况下,衡量和利用所有可用CPU变得更加困难。也可以接受的是,当您获得锁时,您的代码可能已经超过了最后期限,但这不是理想的选择,因为它浪费了一些资源,并且意味着我们无法做类似“性能下降的临时任务”的事情。响应”。

    /* Example 1: LockBefore() for latency sensitive code. */
    func (s *RPCService) DoTheThing(ctx context.Context, ...) ... {
      if s.someObj[req.Parameter].mtx.LockBefore(ctx.Deadline()) {
        defer s.someObj[req.Parameter].mtx.Unlock()
        ... expensive computation based on internal state ...
      } else {
        return s.cheapCachedResponse[req.Parameter]
      }
    }
Run Code Online (Sandbox Code Playgroud)

另一种情况是,当您有一堆应该被触摸但可能被锁定的对象,并且应该在一定时间内完成触摸的位置(例如,更新某些统计信息)。在这种情况下,您也可以使用LockBefore()或某些形式的TryLock(),请参见下面的统计信息示例。

    /* Example 2: TryLock() for updating stats. */
    func (s *StatsObject) updateObjStats(key, value interface{}) {
      if s.someObj[key].TryLock() {
        defer s.someObj[key].Unlock()
        ... update stats ...
        ... fill in s.cheapCachedResponse …
Run Code Online (Sandbox Code Playgroud)

mutex timeout go

0
推荐指数
2
解决办法
481
查看次数

标签 统计

go ×1

mutex ×1

timeout ×1