-
Notifications
You must be signed in to change notification settings - Fork 0
/
examples_test.go
136 lines (104 loc) · 2.58 KB
/
examples_test.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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package goroutinepool_test
import (
"context"
"fmt"
"github.com/ykhrustalev/goroutinepool"
"sync/atomic"
"time"
)
func ExampleRunInPool_basic() {
ctx := context.Background()
var counter int32
// a simple job to increment a number
increment := func(delta int32) func(context.Context) {
return func(ctx context.Context) {
atomic.AddInt32(&counter, delta)
}
}
// jobs
fns := []func(context.Context){
increment(1),
increment(10),
increment(100),
}
// use two workers
goroutinepool.RunInPool(ctx, 2, fns)
fmt.Println(atomic.LoadInt32(&counter))
// Output:
// 111
}
func ExampleRunInPool_cancellation() {
ctx, cancel := context.WithTimeout(context.Background(), 200*time.Millisecond)
defer cancel()
var counter int32
// a simple job to increment a number
increment := func(delta int32) func(context.Context) {
return func(ctx context.Context) {
atomic.AddInt32(&counter, delta)
select {
case <-ctx.Done():
break // won't exit unless cancelled
}
time.Sleep(200 * time.Millisecond)
}
}
// jobs
fns := []func(context.Context){
increment(1), // executed and waited
increment(10), // executed and waited
increment(100), // will be cancelled by timeout
}
// use two workers
goroutinepool.RunInPool(ctx, 2, fns)
fmt.Println(atomic.LoadInt32(&counter))
// Output:
// 11
}
func ExampleRunInPoolWithChan_bufferedChannel() {
ctx := context.Background()
var counter int32
// a simple job to increment a number
increment := func(delta int32) func(context.Context) {
return func(ctx context.Context) {
atomic.AddInt32(&counter, delta)
}
}
// create a buffered channel
ch := make(chan func(context.Context), 2)
// extend channel with jobs
// note, that channel gets closed using this function
goroutinepool.PopulateAndCloseChan(ctx, ch, []func(context.Context){
increment(1),
increment(10),
increment(100),
})
// use two workers
goroutinepool.RunInPoolWithChan(ctx, 2, ch)
fmt.Println(atomic.LoadInt32(&counter))
// Output:
// 111
}
func ExampleNonBufferedChan() {
ctx := context.Background()
var counter int32
// a simple job to increment a number
increment := func(delta int32) func(context.Context) {
return func(ctx context.Context) {
atomic.AddInt32(&counter, delta)
}
}
// jobs
fns := []func(context.Context){
increment(1), // executed and waited
increment(10), // executed and waited
increment(100), // will be cancelled by timeout
}
// use two workers
ch := goroutinepool.NonBufferedChan(ctx, fns)
for fn := range ch {
fn(ctx)
}
fmt.Println(atomic.LoadInt32(&counter))
// Output:
// 111
}