实现思路
- 使用一个通道(channel)来作为任务队列,用于存储待执行的任务。
- 创建若干个goroutine作为工作者(worker),这些工作者从任务队列中取出任务并执行。
- 提供一个函数用于向任务队列中添加任务。
核心代码示例
package main
import (
"fmt"
)
// 定义任务类型,这里是一个无参数无返回值的函数
type Task func()
// 任务队列,使用通道实现
var taskQueue chan Task
// 启动工作者
func worker(id int, taskQueue chan Task) {
for task := range taskQueue {
fmt.Printf("Worker %d is starting task\n", id)
task()
fmt.Printf("Worker %d has finished task\n", id)
}
}
// 添加任务到队列
func AddTask(task Task) {
taskQueue <- task
}
func main() {
// 初始化任务队列
taskQueue = make(chan Task, 100)
// 启动3个工作者
for i := 1; i <= 3; i++ {
go worker(i, taskQueue)
}
// 添加任务
AddTask(func() {
fmt.Println("Task 1 is running")
})
AddTask(func() {
fmt.Println("Task 2 is running")
})
// 关闭任务队列,让工作者退出
close(taskQueue)
// 防止主函数过早退出
select {}
}