github.com/Mrs4s/MiraiGo@v0.0.0-20240226124653-54bdd873e3fe/utils/waiter.go (about)

     1  package utils
     2  
     3  import "sync"
     4  
     5  // UploadWaiter 用于控制并发上传,当有一个文件多次上传时,
     6  // 等待第一个上传,后续的上传并发进行(可以秒传).
     7  type UploadWaiter struct {
     8  	mu sync.Mutex
     9  	m  map[string]*sync.WaitGroup
    10  }
    11  
    12  // NewUploadWaiter return a new UploadWaiter.
    13  func NewUploadWaiter() *UploadWaiter {
    14  	return &UploadWaiter{
    15  		m: make(map[string]*sync.WaitGroup),
    16  	}
    17  }
    18  
    19  // Wait 如果不是第一个上传则等待。
    20  func (s *UploadWaiter) Wait(key string) {
    21  	s.mu.Lock()
    22  	if w, ok := s.m[key]; ok {
    23  		s.mu.Unlock()
    24  		w.Wait()
    25  	} else {
    26  		wg := new(sync.WaitGroup)
    27  		wg.Add(1)
    28  		s.m[key] = wg
    29  		s.mu.Unlock()
    30  	}
    31  }
    32  
    33  // Done 当前上传任务已完成。
    34  func (s *UploadWaiter) Done(key string) {
    35  	s.mu.Lock()
    36  	if w, ok := s.m[key]; ok {
    37  		w.Done()
    38  		delete(s.m, key)
    39  	}
    40  	s.mu.Unlock()
    41  }