下面是一个简单的示例,演示如何使用goroutine和channel实现一个基本的线程池:
package main
import (
"fmt"
"sync"
)
func worker(id int, jobs <-chan int, results chan<- int) {
for job := range jobs {
fmt.Println("Worker", id, "started job", job)
// 模拟任务执行时间
for i := 0; i < 10000000; i++ {
// 执行任务...
}
fmt.Println("Worker", id, "finished job", job)
results <- job * 2
}
}
func main() {
numJobs := 10
numWorkers := 3
jobs := make(chan int, numJobs)
results := make(chan int, numJobs)
var wg sync.WaitGroup
// 创建固定数量的工作线程
for i := 1; i <= numWorkers; i++ {
wg.Add(1)
go func(workerID int) {
defer wg.Done()
worker(workerID, jobs, results)
}(i)
}
go func() {
// 平均分配任务给工作线程
for i := 1; i <= numJobs; i++ {
jobs <- i
}
close(jobs) // 关闭任务通道,表示没有更多任务需要执行
}()
go func() {
wg.Wait()
close(results) // 关闭结果通道,表示所有结果已经处理完毕
}()
// 处理工作线程返回的结果
for result := range results {
fmt.Println("Result:", result)
}
}
在这个例子中,我们创建了一个包含3个工作线程的线程池,并通过channel将任务分发给它们。主线程使用jobs通道向工作线程发送任务,每个工作线程从jobs通道中接收任务并执行。结果通过results通道传回主线程进行处理。
请注意,这只是一个简单示例,实际应用中可能需要更多的错误处理和调度策略。同时要注意控制goroutine的数量,以避免资源耗尽问题。
内容由零声教学AI助手提供,问题来源于学员提问




