跳到主要内容

为什么要重用线程

· 阅读需 2 分钟
素明诚
Full stack development

减少开销:线程的创建和销毁涉及内存分配和释放,以及相关系统资源的初始化和清理,这些都是有时间和空间开销的。通过重用线程,可以避免这些开销,从而提高系统效率。

提高响应速度:现成的空闲线程可以立即被分配来处理新的任务,避免了线程创建的延时,从而提高了系统的响应速度。

降低内存碎片化:频繁的内存分配和释放可能导致内存碎片化,影响内存利用率。线程重用通过减少内存分配和释放频率,有助于降低内存碎片化。

节约系统资源:每个线程的创建都会占用一定的系统资源。线程重用可以节约这些资源,提升系统的扩展性和稳定性。

package main

import (
"fmt"
"sync"
)

// 任务
type Task struct {
id int
}

// worker函数,处理任务
func worker(id int, tasks <-chan Task, wg *sync.WaitGroup) {
defer wg.Done() // 在函数退出时,通知WaitGroup一个任务已完成

for task := range tasks { // 循环从任务通道接收任务并处理
fmt.Printf("Worker %d processing task %d\n", id, task.id)
}
}

func main() {
const numWorkers = 5 // 定义worker数量
const numTasks = 10 // 定义任务数量

tasks := make(chan Task, numTasks) // 创建任务通道
var wg sync.WaitGroup // 创建一个WaitGroup以等待所有任务完成

// 启动worker goroutines
for i := 1; i <= numWorkers; i++ {
wg.Add(1) // 为每个worker增加一个任务计数
go worker(i, tasks, &wg) // 启动worker
}

// 将任务发送到任务通道
for i := 1; i <= numTasks; i++ {
tasks <- Task{id: i}
}

close(tasks) // 关闭任务通道,通知所有worker没有更多任务
wg.Wait() // 等待所有任务完成
}