Goroutines pool with priority queue buffer
Find a file
2022-05-29 16:19:48 +03:00
.github Enable GitHub actions 2021-10-23 18:42:26 +03:00
.golangci.yml Enable GitHub actions 2021-10-23 18:42:26 +03:00
go.mod Update dependencies 2022-05-29 16:19:48 +03:00
go.sum Update dependencies 2022-05-29 16:19:48 +03:00
LICENSE Reformat priopool as library package 2021-10-23 18:16:40 +03:00
pool.go Fix heap package usage 2022-05-29 15:53:13 +03:00
pool_test.go Fix heap package usage 2022-05-29 15:53:13 +03:00
queue.go Fix heap package usage 2022-05-29 15:53:13 +03:00
README.md Add example in README 2022-05-29 16:10:39 +03:00

Goroutines pool with priority queue buffer.


Overview

Package priopool provides goroutines pool based on panjf2000/ants library with priority queue buffer based on stdlib heap package.

Priority pool:

  • is non-blocking,
  • prioritizes tasks with higher priority value,
  • can be configured with unlimited queue buffer.

Install

go get -u github.com/alexvanin/priopool

Example

package main

import (
	"fmt"
	"log"
	"sync"
	"time"

	"github.com/alexvanin/priopool"
)

func main() {
	regularJob := func(i int) {
		time.Sleep(1 * time.Second)
		fmt.Printf("Job %d is done\n", i)
	}

	highPriorityJob := func() {
		fmt.Println("High priority job is done")
	}

	pool, err := priopool.New(2, -1) // pool for two parallel executions
	if err != nil {
		log.Fatal(err)
	}

	wg := new(sync.WaitGroup)
	wg.Add(5 + 1)
	for i := 0; i < 5; i++ {
		ind := i + 1
		// enqueue 5 regular jobs
		pool.Submit(1, func() { regularJob(ind); wg.Done() })
	}
	// after 5 regular jobs enqueue high priority job
	pool.Submit(10, func() { highPriorityJob(); wg.Done() })
	wg.Wait()

	/*
		Output:
		Job 2 is done
		Job 1 is done
		High priority job is done
		Job 4 is done
		Job 3 is done
		Job 5 is done
	*/
}

License

Source code is available under the MIT License.