Repository navigation
Expand file tree
/
Copy pathworker.go
More file actions
70 lines (61 loc) · 1.46 KB
/
Copy pathworker.go
File metadata and controls
70 lines (61 loc) · 1.46 KB
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
/*
* Copyright (c) 2023 ivfzhou
* goroutine-pool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package goroutine_pool
import (
"log"
"runtime"
"sync/atomic"
"time"
)
var channelLength = func() int {
if runtime.GOMAXPROCS(0) == 1 {
return 0
}
return 1
}()
type worker struct {
startIdleTime time.Time
running atomic.Uint32
channel chan func()
}
func newWorker() *worker {
return &worker{startIdleTime: time.Now().Add(defaultIdleTimeout), channel: make(chan func(), channelLength)}
}
func wrapperPanic(f func()) func() {
return func() {
defer func() {
if p := recover(); p != nil {
log.Printf("panic: %v", p)
}
}()
f()
}
}
func (w *worker) start() {
go func() {
for fn := range w.channel {
w.running.Store(1)
wrapperPanic(fn)()
w.startIdleTime = time.Now()
w.running.Store(0)
}
}()
}
func (w *worker) isIdle(idleTimeout time.Duration) bool {
if w.running.Load() <= 0 && time.Now().After(w.startIdleTime.Add(idleTimeout)) {
return true
}
return false
}
func (w *worker) close() {
close(w.channel)
}