Files
butterfliu/queue.go
2026-01-08 20:48:55 +08:00

40 lines
573 B
Go

package main
import (
"context"
"log"
)
type Task func() error
type Queue struct {
ch chan Task
done chan struct{}
}
func NewQueue(buf int) *Queue { return &Queue{ch: make(chan Task, buf)} }
func (q *Queue) Push(t Task) { q.ch <- t }
func (q *Queue) Run(ctx context.Context) {
q.done = make(chan struct{})
go func() {
defer close(q.done)
for {
select {
case t := <-q.ch:
if err := t(); err != nil {
log.Printf("task failed: %v", err)
}
case <-ctx.Done():
return
}
}
}()
}
func (q *Queue) Stop() {
close(q.ch)
<-q.done
}