worker-pool: init
This commit is contained in:
53
worker-pool/Makefile
Normal file
53
worker-pool/Makefile
Normal file
@ -0,0 +1,53 @@
|
||||
.DEFAULT_GOAL := help
|
||||
|
||||
# ==================================================================================== #
|
||||
# HELPERS
|
||||
# ==================================================================================== #
|
||||
|
||||
## help: print this help message
|
||||
.PHONY: help
|
||||
help:
|
||||
@echo 'Usage:'
|
||||
@sed -n 's/^##//p' ${MAKEFILE_LIST} | column -t -s ':' | sed -e 's/^/ /'
|
||||
|
||||
## all: tidy + audit + test/cover
|
||||
all: generate tidy test lint test/cover
|
||||
|
||||
|
||||
# ==================================================================================== #
|
||||
# QUALITY CONTROL
|
||||
# ==================================================================================== #
|
||||
|
||||
## tidy: format code and tidy modfile
|
||||
.PHONY: tidy
|
||||
tidy:
|
||||
go fmt ./...
|
||||
goimports -local=$(shell cat go.mod | grep module | awk '{print $$2}')/ -w .
|
||||
go mod tidy -v
|
||||
|
||||
## audit: run quality control checks
|
||||
.PHONY: lint
|
||||
lint:
|
||||
go mod verify
|
||||
go run github.com/golangci/golangci-lint/cmd/golangci-lint@latest run -v ./...
|
||||
|
||||
|
||||
# ==================================================================================== #
|
||||
# DEVELOPMENT
|
||||
# ==================================================================================== #
|
||||
|
||||
## generate: run all generators
|
||||
.PHONY: generate
|
||||
generate:
|
||||
go generate ./...
|
||||
|
||||
## test: run all tests
|
||||
.PHONY: test
|
||||
test:
|
||||
go test -race -buildvcs ./...
|
||||
|
||||
## test/cover: run all tests and display coverage
|
||||
.PHONY: test/cover
|
||||
test/cover:
|
||||
go test -race -buildvcs -coverprofile=/tmp/coverage.out ./...
|
||||
go tool cover -html=/tmp/coverage.out
|
11
worker-pool/go.mod
Normal file
11
worker-pool/go.mod
Normal file
@ -0,0 +1,11 @@
|
||||
module worker-pool
|
||||
|
||||
go 1.21.6
|
||||
|
||||
require github.com/stretchr/testify v1.8.4
|
||||
|
||||
require (
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
21
worker-pool/main.go
Normal file
21
worker-pool/main.go
Normal file
@ -0,0 +1,21 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
func WorkerPool[T any](limit int, worker func(int, T)) chan<- T {
|
||||
tasks := make(chan T, limit)
|
||||
|
||||
for i := 1; i <= limit; i++ {
|
||||
go func(i int) {
|
||||
defer fmt.Printf("worker:%d done\n", i)
|
||||
|
||||
for t := range tasks {
|
||||
worker(i, t)
|
||||
}
|
||||
}(i)
|
||||
}
|
||||
|
||||
return tasks
|
||||
}
|
41
worker-pool/main_test.go
Normal file
41
worker-pool/main_test.go
Normal file
@ -0,0 +1,41 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestWorkerPool(t *testing.T) {
|
||||
const tasks = 5
|
||||
|
||||
var wg sync.WaitGroup
|
||||
wg.Add(tasks)
|
||||
|
||||
var mt sync.Mutex
|
||||
done := make(map[int]bool, tasks)
|
||||
|
||||
worker := func(pid int, task int) {
|
||||
defer wg.Done()
|
||||
|
||||
mt.Lock()
|
||||
done[pid] = true
|
||||
mt.Unlock()
|
||||
|
||||
fmt.Printf("task:%+v\n", task)
|
||||
}
|
||||
|
||||
pool := WorkerPool(tasks, worker)
|
||||
|
||||
for j := 0; j < tasks; j++ {
|
||||
pool <- j
|
||||
}
|
||||
close(pool)
|
||||
wg.Wait()
|
||||
|
||||
for _, v := range done {
|
||||
assert.True(t, v)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user