线程池详解并使用Go语言实现 Pool
在Go语言中,并发和并行的支持是通过goroutines来实现的。goroutines是一种轻量级的线程,它们可以在一个线程里面运行,也可以在多个线程里面运行。
线程池是一种在后台创建并管理线程的方式,它可以在任务完成时重用线程,而不是为每个任务创建新的线程。这样可以提高性能,因为线程的创建和销毁通常是一个重量级的操作。
以下是一个简单的线程池实现:
package main
import (
"fmt"
"sync"
"sync/atomic"
"time"
)
type WorkerPool struct {
workers int
tasks chan func()
wg sync.WaitGroup
}
func NewWorkerPool(workers int) *WorkerPool {
pool := &WorkerPool{
workers: workers,
tasks: make(chan func()),
}
for i := 0; i < workers; i++ {
pool.wg.Add(1)
go func() {
defer pool.wg.Done()
for task := range pool.tasks {
task()
}
}()
}
return pool
}
func (p *WorkerPool) Do(task func()) {
p.tasks <- task
}
func (p *WorkerPool) Wait() {
close(p.tasks)
p.wg.Wait()
}
func main() {
pool := NewWorkerPool(10)
var count int32
for i := 0; i < 100; i++ {
pool.Do(func() {
time.Sleep(10 * time.Millisecond)
atomic.AddInt32(&count, 1)
})
}
pool.Wait()
fmt.Println("Final count is", count)
}
在这个例子中,我们创建了一个有10个工人的线程池。然后,我们并发地向这个线程池提交了100个任务。每个任务都会暂停10毫秒,然后原子性地增加count变量。最后,我们关闭任务通道,等待所有工人完成所有任务,然后打印最终的count值。
这个例子展示了如何使用Go语言创建和使用一个简单的线程池。这个线程池可以被用来并发地执行许多小的任务,从而提高程序的性能。
评论已关闭