Initial release of queue package

This commit is contained in:
Кобелев Андрей Андреевич
2025-10-10 22:50:00 +05:00
commit e3c9643d05
9 changed files with 896 additions and 0 deletions

View File

@@ -0,0 +1,35 @@
package queue_test
import (
"context"
"fmt"
"time"
"git.belvedersky.ru/belvedersky/queue"
)
// Example_basic демонстрирует базовое использование очереди.
func Example_basic() {
type Task struct{ ID int }
q := queue.NewQueue[Task](5)
q.Register(func(t Task) {
fmt.Printf("Handled task %d\n", t.ID)
time.Sleep(50 * time.Millisecond)
})
ctx := context.Background()
q.HandleParallel(ctx, 1)
for i := range 5 {
q.Produce(Task{ID: i})
}
q.Shutdown(context.Background())
// Output:
// Handled task 0
// Handled task 1
// Handled task 2
// Handled task 3
// Handled task 4
}

View File

@@ -0,0 +1,60 @@
package queue_test
import (
"context"
"fmt"
"sync/atomic"
"time"
"git.belvedersky.ru/belvedersky/queue"
)
// Example_DLQ показывает, как использовать Dead Letter Queue
// для перехвата задач, вызвавших панику.
func Example_dlq() {
type Task struct{ ID int }
mainQ := queue.NewQueue[Task](5)
dlq := queue.NewQueue[Task](5)
mainQ.SetDLQ(dlq)
var handled, failed int32
mainQ.Register(func(t Task) {
if t.ID == 3 {
panic("boom")
}
fmt.Printf("✅ handled %d\n", t.ID)
atomic.AddInt32(&handled, 1)
})
dlq.Register(func(t Task) {
fmt.Printf("🚨 sent to DLQ: %d\n", t.ID)
atomic.AddInt32(&failed, 1)
})
ctx := context.Background()
mainQ.HandleParallel(ctx, 1)
dlq.HandleParallel(ctx, 1)
for i := range 5 {
mainQ.Produce(Task{ID: i})
}
mainQ.Close()
mainQ.Wait()
dlq.Close()
dlq.Wait()
time.Sleep(50 * time.Millisecond) // на случай асинхронного вывода
fmt.Printf("Total handled: %d, failed: %d\n", handled, failed)
// Unordered output:
// ✅ handled 0
// ✅ handled 1
// ✅ handled 2
// ✅ handled 4
// 🚨 sent to DLQ: 3
// Total handled: 4, failed: 1
}

View File

@@ -0,0 +1,37 @@
package queue_test
import (
"context"
"fmt"
"sync"
"time"
"git.belvedersky.ru/belvedersky/queue"
)
// Example_parallel демонстрирует работу нескольких воркеров.
func Example_parallel() {
type Task struct{ ID int }
q := queue.NewQueue[Task](5)
var mu sync.Mutex
q.Register(func(t Task) {
mu.Lock()
fmt.Printf("Worker processed: %d\n", t.ID)
mu.Unlock()
time.Sleep(20 * time.Millisecond)
})
ctx := context.Background()
q.HandleParallel(ctx, 4)
for i := range 3 {
q.Produce(Task{ID: i})
}
q.Shutdown(context.Background())
// Unordered output:
// Worker processed: 0
// Worker processed: 1
// Worker processed: 2
}