forked from Angey40/BaiduPCS-Go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
status.go
122 lines (106 loc) · 2.51 KB
/
status.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package uploader
import (
"time"
)
// Status 上传状态
type Status interface {
TotalSize() int64 // 总大小
Uploaded() int64 // 已上传数据
SpeedsPerSecond() int64 // 每秒的上传速度
TimeElapsed() time.Duration // 上传时间
}
// UploadStatus 上传状态
type UploadStatus struct {
totalSize int64 // 总大小
uploaded int64 // 已上传数据
speedsPerSecond int64 // 每秒的上传速度
timeElapsed time.Duration // 上传时间
}
// TotalSize 返回总大小
func (us *UploadStatus) TotalSize() int64 {
return us.totalSize
}
// Uploaded 返回已上传数据
func (us *UploadStatus) Uploaded() int64 {
return us.uploaded
}
// SpeedsPerSecond 返回每秒的上传速度
func (us *UploadStatus) SpeedsPerSecond() int64 {
return us.speedsPerSecond
}
// TimeElapsed 返回上传时间
func (us *UploadStatus) TimeElapsed() time.Duration {
return us.timeElapsed
}
// GetStatusChan 获取上传状态
func (u *Uploader) GetStatusChan() <-chan Status {
c := make(chan Status)
go func() {
for {
select {
case <-u.finished:
close(c)
return
default:
if !u.executed {
time.Sleep(1 * time.Second)
continue
}
old := u.readed64.Readed()
time.Sleep(1 * time.Second) // 每秒统计
readed := u.readed64.Readed()
c <- &UploadStatus{
totalSize: u.readed64.Len(),
uploaded: readed,
speedsPerSecond: readed - old,
timeElapsed: time.Since(u.executeTime) / 1000000 * 1000000,
}
}
}
}()
return c
}
// GetStatusChan 获取上传状态
func (muer *MultiUploader) GetStatusChan() <-chan Status {
muer.lazyInit()
c := make(chan Status)
go func() {
for {
select {
case <-muer.finished:
close(c)
return
default:
if !muer.executed {
time.Sleep(1 * time.Second)
continue
}
old := muer.workers.Readed()
time.Sleep(1 * time.Second) // 每秒统计
readed := muer.workers.Readed()
c <- &UploadStatus{
totalSize: muer.file.Len(),
uploaded: readed,
speedsPerSecond: readed - old,
timeElapsed: time.Since(muer.executeTime) / 1000000 * 1000000,
}
}
}
}()
return c
}
// UpdateInstanceStateChan 更新状态的信号
func (muer *MultiUploader) UpdateInstanceStateChan() <-chan struct{} {
c := make(chan struct{}, 1)
go func() {
for {
select {
case signal := <-muer.updateInstanceStateChan:
c <- signal
case <-muer.finished:
return
}
}
}()
return c
}