GitHub - zenthangplus/go-workerpool: Go WorkerPool aims to control heavy Go Routines

package main

import (
	"fmt"
	"github.com/zenthangplus/go-workerpool"
)

func main() {
	// Init worker pool with 3 workers to run concurrently.
	pool := workerpool.NewFixedSize(3)

	// Start worker pool
	pool.Start()

	// pool.Submit will block until slot available in Pool queue. 
	// Submit an identifiable job, ID will be generated randomly (using UUID)
	pool.Submit(workerpool.NewIdentifiableJob(func() {
		// Do a heavy job
	}))
	// Use NewCustomIdentifierJob if you don't want ID to be generated randomly
	pool.Submit(workerpool.NewCustomIdentifierJob("custom-id", func() { 
		// Do a heavy job
	}))
	// or Submit a simple function without identifier
	pool.SubmitFunc(func() {// simpler way of: Submit(FuncJob(func() {})) 
		// Do a heavy job
	})

	// pool.SubmitConfidently will submit a job in confident mode, 
	// this function will return ErrPoolFull when Pool queue is full.
	err := pool.SubmitConfidently(workerpool.NewIdentifiableJob(func() {
		// Do a heavy job
	}))
	if err == workerpool.ErrPoolFull {
		fmt.Println("Pool is full")
	}
}
package main

import (
	"fmt"
	"github.com/zenthangplus/go-workerpool"
)

func main() {
	// Initiate worker pool with fixed size. Eg: 3 workers to run concurrently.
	pool := workerpool.NewFixedSize(3)

	// Or initiate fixed size worker pool with custom options.
	pool = workerpool.NewFixedSize(3,
		// When you want to custom mode
		workerpool.WithMode(workerpool.FixedSize),
		
		// When you want to custom number of workers
		workerpool.WithNumberWorkers(5),
		
		// When you want to customize capacity
		workerpool.WithCapacity(6),
		
		// When you want to custom log function
		workerpool.WithLogFunc(func(msgFormat string, args ...interface{}) {
			fmt.Printf(msgFormat+"\n", args...)
		}),
	)

	// Start worker pool
	pool.Start()
	
	// Init a functional job with ID is generated randomly
	job1 := workerpool.NewIdentifiableJob(func() {})

	// init a functional job with predefined ID
	job2 := workerpool.NewCustomIdentifierJob("test-an-id", func() {})

	// Submit job in normal mode, it will block until pool has available slot.
	pool.Submit(job1)
	
	// or Submit a simple function
	pool.SubmitFunc(func() {})
	
	// Submit in confident mode, it will return ErrPoolFull when pool is full. 
	err := pool.SubmitConfidently(job2)
	if err != nil {
		fmt.Print(err)
	}
}

// CompressDirJob
// You can create a custom Job by implement `Job` interface
type CompressDirJob struct {
	directory string
}

func NewCompressDirJob(directory string) *CompressDirJob {
	return &CompressDirJob{directory: directory}
}

func (c CompressDirJob) Id() string {
	return "directory-" + c.directory
}

func (c CompressDirJob) Exec() {
	// Do compress directory
}