Categorygithub.com/yarcat/taskq
repositorypackage
0.0.0-20240318105322-fd93a014dd95
Repository: https://github.com/yarcat/taskq.git
Documentation: pkg.go.dev

# README

A super lightweight Redis-backed task queue for Golang

Installation

go get github.com/yarcat/taskq

Usage

type MyTask struct {
	Phrase   string
	Duration time.Duration
}

// MyTaskHandler contains the business logic for handling MyTask.
// The following fields are given as an example. In real life, you may want to
// use a logger, a database connection, another task queue, etc.
type MyTaskHandler struct {
	Print func(string) error
	Sleep func(time.Duration)
}

func (h MyTaskHandler) Handle(ctx context.Context, task MyTask) error {
	h.Sleep(task.Duration)
	if err := h.Print(task.Phrase); err != nil {
		return fmt.Errorf("printing: %w", err)
	}
	return nil
}

func Example() {
	ctx := context.Background()

	client := redis.NewClient(&redis.Options{
		Addr: "172.21.169.52:6379",
		// This example creates "my" and "my-processing" keys in Redis.
		// Consider using a different redis.Options.DB to avoid conflicts.
		// DB: 12,
	})

	h := &MyTaskHandler{
		Print: func(s string) error {
			_, err := fmt.Println(s)
			return err
		},
		Sleep: time.Sleep,
	}

	var wg sync.WaitGroup
	wg.Add(1)

	queue := taskq.New(ctx, "my", client, h.Handle,
		taskq.WithProcessNext(stopAfterIterations(2)),
		taskq.WithNotifyStopped(wg.Done),
	)
	queue.Add(ctx, MyTask{"Sleep 1", 1 * time.Second})
	queue.Add(ctx, MyTask{"Sleep 2", 2 * time.Second})

	wg.Wait()
}