如何立即尝试仅获取一个类似于互斥锁的锁,要么立即中止操作(如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)