Acquire方法将获取指定数量的资源。如果当前可用资源数量不足,调用此方法的任务将被阻塞,并加入到等待队列中。
[code]func (s *Weighted) Acquire(ctx context.Context, n int64) error { // 1. 使用互斥锁s.mu对Weighted类型进行加锁,确保并发安全性。 s.mu.Lock() // size - cur 代表剩余可用资源数,如果大于请求资源数n, 此时代表剩余可用资源 大于 需要的资源数 // 其次,Weighted资源分配的顺序是FIFO,如果等待队列不为空,当前请求就需要自动放到队列最后面 if s.size-s.cur >= n && s.waiters.Len() == 0 { s.cur += n s.mu.Unlock() return nil } // s.size 代表最大资源数,如果需要的资源数 大于 最大资源数,此时直接返回错误 if n > s.size { // Don't make other Acquire calls block on one that's doomed to fail. s.mu.Unlock()