https://github.com/zenthangplus/go-workerpool
Go WorkerPool aims to control heavy Go Routines
https://github.com/zenthangplus/go-workerpool
golang goroutine threadpool workerpool
Last synced: 9 months ago
JSON representation
Go WorkerPool aims to control heavy Go Routines
- Host: GitHub
- URL: https://github.com/zenthangplus/go-workerpool
- Owner: zenthangplus
- License: mit
- Created: 2022-05-29T02:57:22.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2022-08-20T15:05:50.000Z (over 3 years ago)
- Last Synced: 2024-07-31T20:51:54.688Z (over 1 year ago)
- Topics: golang, goroutine, threadpool, workerpool
- Language: Go
- Homepage:
- Size: 27.3 KB
- Stars: 12
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-go-plus - go-workerpool - Inspired from Java Thread Pool, Go WorkerPool aims to control heavy Go Routines.  (Goroutines / Search and Analytic Databases)
- awesome-go - go-workerpool - Inspired from Java Thread Pool, Go WorkerPool aims to control heavy Go Routines. (Goroutines / Search and Analytic Databases)
- awesome-go-cn - go-workerpool - workerpool) [![godoc][D]](https://godoc.org/github.com/zenthangplus/go-workerpool) (Goroutines / 检索及分析资料库)
- awesome-go - go-workerpool - Inspired from Java Thread Pool, Go WorkerPool aims to control heavy Go Routines. (Goroutines / Search and Analytic Databases)
- fucking-awesome-go - go-workerpool - Inspired from Java Thread Pool, Go WorkerPool aims to control heavy Go Routines. (Goroutines / Search and Analytic Databases)
- awesome-go - go-workerpool - Inspired from Java Thread Pool, Go WorkerPool aims to control heavy Go Routines. (Goroutines / Search and Analytic Databases)
- awesome-go-with-stars - go-workerpool - Inspired from Java Thread Pool, Go WorkerPool aims to control heavy Go Routines. (Goroutines / Search and Analytic Databases)
- awesome-go - go-workerpool - Inspired from Java Thread Pool, Go WorkerPool aims to control heavy Go Routines. (Goroutines / Search and Analytic Databases)
- awesome-go - go-workerpool - Inspired from Java Thread Pool, Go WorkerPool aims to control heavy Go Routines. (Goroutines / Search and Analytic Databases)
- awesome-go-cn - go-workerpool - workerpool) (Goroutines / 检索及分析资料库)
README
# Golang Worker Pool
[](https://github.com/zenthangplus/go-workerpool/actions/workflows/test.yml)
[](https://codecov.io/gh/zenthangplus/go-workerpool)
[](https://goreportcard.com/report/github.com/zenthangplus/go-workerpool)
Inspired from Java Thread Pool, Go WorkerPool aims to control heavy Go Routines.
## Installation
The simplest way to install the library is to run:
```shell
go get github.com/zenthangplus/go-workerpool
```
## Example
```go
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")
}
}
```
## Usage
```go
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
}
```