59 lines
730 B
Go
59 lines
730 B
Go
package queue
|
|
|
|
import (
|
|
"context"
|
|
"sync"
|
|
)
|
|
|
|
type Task func(context.Context) error
|
|
|
|
type Queue struct {
|
|
mu sync.Mutex
|
|
closed bool
|
|
ch chan Task
|
|
}
|
|
|
|
func New(size int) *Queue {
|
|
if size < 1 {
|
|
size = 1
|
|
}
|
|
return &Queue{ch: make(chan Task, size)}
|
|
}
|
|
|
|
func (q *Queue) Start(ctx context.Context) {
|
|
for {
|
|
select {
|
|
case <-ctx.Done():
|
|
return
|
|
case task, ok := <-q.ch:
|
|
if !ok {
|
|
return
|
|
}
|
|
if task != nil {
|
|
_ = task(ctx)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func (q *Queue) Enqueue(task Task) bool {
|
|
q.mu.Lock()
|
|
defer q.mu.Unlock()
|
|
if q.closed {
|
|
return false
|
|
}
|
|
q.ch <- task
|
|
return true
|
|
}
|
|
|
|
func (q *Queue) Close() {
|
|
q.mu.Lock()
|
|
if q.closed {
|
|
q.mu.Unlock()
|
|
return
|
|
}
|
|
q.closed = true
|
|
close(q.ch)
|
|
q.mu.Unlock()
|
|
}
|