# go-worker-pool **Repository Path**: Cookie_XiaoD/go-worker-pool ## Basic Information - **Project Name**: go-worker-pool - **Description**: go实现的简易工作者池 - **Primary Language**: Go - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2021-08-19 - **Last Updated**: 2021-11-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # golang工作者池 #### 介绍 go实现的简易工作者池,适合分发任务执行的场景 #### 说明 1. 调度器Stop方法需等待所有Worker正在处理中的任务执行完毕,注意不包括还未调度的任务 2. 暂不支持取消、暂停 #### 使用场景 有些场景需要开启协程处理大量任务,但是若每处理一个任务就开启一个协程会造成资源浪费, 因此更合适的方式是由一个协程进行任务分发,确定数量的工作者协程处理这些任务。 #### 安装 go get -u gitee.com/Cookie_XiaoD/go-worker-pool #### 使用说明 ```golang package main import ( "fmt" workpool "gitee.com/Cookie_XiaoD/go-worker-pool" "log" "math/rand" "os" "os/signal" "runtime" "syscall" "time" ) func main() { d, err := workpool.NewDispatcher(workpool.MaxJobs(1000), workpool.MaxWorkers(10)) if err != nil { log.Fatal(err) } if err = d.Run(); err != nil { log.Fatal(err) } /* 比如50个任务,10个worker,每个任务固定耗时2秒,则大概需要10秒可以完成50个任务(取决于配置) 若每个任务耗时0到2秒,则当任务结束时worker可以立马执行下一个任务,总耗时低于10秒 */ for i := 0; i < 50; i++ { jobID := i + 1 job := &TestJob{Id: fmt.Sprintf("任务%v", jobID)} d.HandleJob(job) log.Println("有任务需要执行", job, "当前协程数量:", runtime.NumGoroutine()) } ch := make(chan os.Signal) signal.Notify(ch, os.Interrupt, os.Kill, syscall.SIGTERM, syscall.SIGQUIT) <-ch fmt.Println("开始stop") d.Stop() fmt.Println("已经stop") } type TestJob struct { Id string } func (t *TestJob) GetId() string { return t.Id } func (t *TestJob) Exec() error { log.Println("开始执行任务", t.Id) duration := time.Duration(rand.Intn(3)) * time.Second time.Sleep(duration) log.Println("任务执行完毕", t.Id, "耗时:", duration.Seconds(), "秒") return nil } ```