golang线程池ants-实现架构
warning:
这篇文章距离上次修改已过190天,其中的内容可能已经有所变动。
以下是一个简化的Go语言实现线程池的示例代码,它遵循ants-pool库的基本架构:
package main
import (
"fmt"
"sync"
"time"
)
// Pool 代表一个线程池结构体
type Pool struct {
workers int
jobs chan func()
workerQueue chan bool
lock sync.Mutex
}
// NewPool 创建一个新的线程池
func NewPool(workers int) *Pool {
pool := &Pool{
workers: workers,
jobs: make(chan func()),
workerQueue: make(chan bool, workers),
}
return pool
}
// Run 向线程池提交一个任务
func (p *Pool) Run(job func()) {
p.jobs <- job
}
// worker 工作者函数
func (p *Pool) worker(id int) {
for {
p.workerQueue <- true
job := <-p.jobs
if job == nil {
<-p.workerQueue
return
}
job()
<-p.workerQueue
}
}
// Start 启动线程池
func (p *Pool) Start() {
for i := 0; i < p.workers; i++ {
go p.worker(i)
}
}
// Stop 停止线程池
func (p *Pool) Stop() {
for i := 0; i < p.workers; i++ {
p.Run(nil)
}
}
func main() {
pool := NewPool(10)
pool.Start()
for i := 0; i < 10; i++ {
job := func() {
fmt.Println("Job is running on worker:", i)
time.Sleep(2 * time.Second)
}
pool.Run(job)
}
time.Sleep(3 * time.Second)
pool.Stop()
}
这段代码首先定义了一个Pool
结构体,它包含了线程池的基本属性,如工作线程数workers
、任务管道jobs
和一个控制线程数的信号管道workerQueue
。然后实现了NewPool
、Run
、worker
、Start
和Stop
方法。Start
方法启动了指定数量的工作线程,worker
方法会不断从任务管道中取出任务执行。Stop
方法则用于停止线程池,通过向每个工作线程发送nil
任务来实现。
在main
函数中,我们创建了一个线程池,启动它,并向其提交了10个任务。每个任务打印出当前运行的工作线程ID,并休眠2秒钟。最后,主线程休眠3秒钟让任务有时间执行,然后停止线程池。
评论已关闭