github.com/iikira/iikira-go-utils@v0.0.0-20230610031953-f2cb11cde33a/requester/uploader/status.go (about)

     1  package uploader
     2  
     3  import (
     4  	"time"
     5  )
     6  
     7  type (
     8  	// Status 上传状态接口
     9  	Status interface {
    10  		TotalSize() int64           // 总大小
    11  		Uploaded() int64            // 已上传数据
    12  		SpeedsPerSecond() int64     // 每秒的上传速度
    13  		TimeElapsed() time.Duration // 上传时间
    14  	}
    15  
    16  	// UploadStatus 上传状态
    17  	UploadStatus struct {
    18  		totalSize       int64         // 总大小
    19  		uploaded        int64         // 已上传数据
    20  		speedsPerSecond int64         // 每秒的上传速度
    21  		timeElapsed     time.Duration // 上传时间
    22  	}
    23  
    24  	UploadStatusFunc func(status Status, updateChan <-chan struct{})
    25  )
    26  
    27  // TotalSize 返回总大小
    28  func (us *UploadStatus) TotalSize() int64 {
    29  	return us.totalSize
    30  }
    31  
    32  // Uploaded 返回已上传数据
    33  func (us *UploadStatus) Uploaded() int64 {
    34  	return us.uploaded
    35  }
    36  
    37  // SpeedsPerSecond 返回每秒的上传速度
    38  func (us *UploadStatus) SpeedsPerSecond() int64 {
    39  	return us.speedsPerSecond
    40  }
    41  
    42  // TimeElapsed 返回上传时间
    43  func (us *UploadStatus) TimeElapsed() time.Duration {
    44  	return us.timeElapsed
    45  }
    46  
    47  // GetStatusChan 获取上传状态
    48  func (u *Uploader) GetStatusChan() <-chan Status {
    49  	c := make(chan Status)
    50  
    51  	go func() {
    52  		for {
    53  			select {
    54  			case <-u.finished:
    55  				close(c)
    56  				return
    57  			default:
    58  				if !u.executed {
    59  					time.Sleep(1 * time.Second)
    60  					continue
    61  				}
    62  
    63  				old := u.readed64.Readed()
    64  				time.Sleep(1 * time.Second) // 每秒统计
    65  
    66  				readed := u.readed64.Readed()
    67  				c <- &UploadStatus{
    68  					totalSize:       u.readed64.Len(),
    69  					uploaded:        readed,
    70  					speedsPerSecond: readed - old,
    71  					timeElapsed:     time.Since(u.executeTime) / 1e7 * 1e7,
    72  				}
    73  			}
    74  		}
    75  	}()
    76  	return c
    77  }
    78  
    79  func (muer *MultiUploader) uploadStatusEvent() {
    80  	if muer.onUploadStatusEvent == nil {
    81  		return
    82  	}
    83  
    84  	go func() {
    85  		ticker := time.NewTicker(1 * time.Second) // 每秒统计
    86  		defer ticker.Stop()
    87  		for {
    88  			select {
    89  			case <-muer.finished:
    90  				return
    91  			case <-ticker.C:
    92  				readed := muer.workers.Readed()
    93  				muer.onUploadStatusEvent(&UploadStatus{
    94  					totalSize:       muer.file.Len(),
    95  					uploaded:        readed,
    96  					speedsPerSecond: muer.speedsStat.GetSpeeds(),
    97  					timeElapsed:     time.Since(muer.executeTime) / 1e8 * 1e8,
    98  				}, muer.updateInstanceStateChan)
    99  			}
   100  		}
   101  	}()
   102  }