-
Notifications
You must be signed in to change notification settings - Fork 0
/
interface.go
147 lines (109 loc) · 2.84 KB
/
interface.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
137
138
139
140
141
142
143
144
145
146
147
package goest_worker
import (
"time"
"context"
)
// Channel for free workers
type workerPoolType chan iWorker
// Factory for creating new queues
type PoolQueue func(ctx context.Context, capacity int) Queue
// Factory for creating new counters
type CounterMiddleware func() Counter
// inner interface
type workerPool interface {
// getting context
Context() context.Context
// run job to pool
Insert(jobCall) ()
// create periodic job
InsertPeriodic(job Job, period interface{}, arguments ... interface{}) (PeriodicJob, error)
}
// inner interface
type jobCall interface {
// private method for calling jobs
call()
// calc priority
Priority() int
}
// Pool defines pool interface required for use on client-side
type Pool interface {
// Start pool
Start(ctx context.Context, count int) Pool
// Stop pool
Stop()
// getting context
Context() context.Context
// Create new job from any function
NewJob(taskFn interface{}) (Job)
// Waiting for run all functions or <- context.Done()
Wait()
// use middlewares, queues and other (TODO: middleware)
Use(args ... interface{}) Pool
// change the numbers of workers
Resize(count int) Pool
}
// Job defines job interface required for use on client side
type Job interface {
// Set the first argument to current JobInstance
Bind(val bool) Job
// Put current job to pool
Run(args ... interface{}) JobInstance
// Put current job to pool every, use:
// time.Duration
// "0 */5 * ? * *" // cron expression
RunEvery(period interface{}, args ... interface{}) (PeriodicJob, error)
// Put current job to pool with priority
RunWithPriority(priority int, args ... interface{}) JobInstance
}
// JobInstance defines current job instance interface required for use on client side
type JobInstance interface {
// Get context
Context() context.Context
// Cancel job
Cancel()
// Get results
Results(args ... interface{}) error
// Wait (<-context.Done())
Wait() JobInstance
}
//
type PeriodicJob interface {
// get next time to running
Next(time.Time) time.Time
// Put current job to pool
Run() ()
}
// iWorker defines all worker interface required for use in the pool
type iWorker interface {
// Start worker
Start()
// Put job to worker
AddJob(jobCall) ()
// Get context
Context() (ctx context.Context)
// Close worker
Cancel()
}
// Queue defines all queue interface required for use in the pool
type Queue interface {
// get job
Pop() (jobCall)
// Insert job
Insert(job jobCall)
// size of queue
Len() (uint64)
// change capacity
SetCapacity(ctx context.Context, capacity int)
}
// The counter is used to count the tasks in the pool.
// Used to wait for all tasks to complete.
type Counter interface {
// ++i
Increment()
// --i
Decrement()
// Waits while counter value will be equals to zero or context will be done
Wait(context.Context)
// Get counter value
Len() uint64
}