使用优先队列结合worker池可实现Go中任务优先级调度,核心为通过heap.Interface定义优先队列,按任务优先级排序,多个worker从队列中取出高优先级任务执行,适用于消息队列、爬虫等场景。

Go语言本身没有内置的优先级调度机制,goroutine的调度由运行时系统自动管理,开发者无法直接控制其执行顺序。但可以通过一些设计模式和数据结构来实现任务优先级调度,尤其是在需要对并发任务进行优先级控制的场景下,比如后台任务处理、消息队列、爬虫系统等。
核心思路是:将任务按优先级存入一个优先队列(通常用最小堆或最大堆实现),由一组worker从队列中取出高优先级任务执行。
关键组件:示例代码结构:
<font face="Courier New">
type Task struct {
Priority int
Job func()
}
// 实现 heap.Interface 的 PriorityQueue
type PriorityQueue []*Task
func (pq PriorityQueue) Len() int { return len(pq) }
func (pq PriorityQueue) Less(i, j int) bool { return pq[i].Priority > pq[j].Priority } // 最大堆
func (pq PriorityQueue) Swap(i, j int) { pq[i], pq[j] = pq[j], pq[i] }
func (pq *PriorityQueue) Push(x interface{}) {
*pq = append(*pq, x.(*Task))
}
func (pq *PriorityQueue) Pop() interface{} {
old := *pq
n := len(old)
item := old[n-1]
*pq = old[0 : n-1]
return item
}
var taskQueue = make(chan *Task, 100)
// Worker 函数
func worker(wg *sync.WaitGroup) {
defer wg.Done()
for task := range taskQueue {
task.Job()
}
}
// 启动 worker 池
func StartWorkerPool(n int) {
var wg sync.WaitGroup
for i := 0; i < n; i++ {
wg.Add(1)
go worker(&wg)
}
wg.Wait()
}
</font>注意:上面只是基础框架。实际中可将taskQueue替换为优先队列+互斥锁封装的调度器,确保每次取的是最高优先级任务。
立即学习“go语言免费学习笔记(深入)”;
直接使用channel无法保证优先级,因此需封装一个安全的优先调度器:
<font face="Courier New">
type Scheduler struct {
mu sync.Mutex
heap PriorityQueue
cond *sync.Cond
}
func NewScheduler() *Scheduler {
s := &Scheduler{}
s.cond = sync.NewCond(&s.mu)
return s
}
func (s *Scheduler) Push(task *Task) {
s.mu.Lock()
defer s.mu.Unlock()
heap.Push(&s.heap, task)
s.cond.Signal() // 唤醒等待的worker
}
func (s *Scheduler) Pop() *Task {
s.mu.Lock()
defer s.mu.Unlock()
for s.heap.Len() == 0 {
s.cond.Wait() // 阻塞等待任务
}
return heap.Pop(&s.heap).(*Task)
}
</font>Worker从Scheduler.Pop()获取任务,自然获得最高优先级任务。
在真实系统中,任务可能需要取消或设置超时。使用context可以增强调度器的控制能力:
例如:
<font face="Courier New">
type Task struct {
Priority int
Ctx context.Context
Job func(context.Context)
}
</font>这种模式适用于:
以上就是Golang如何实现并发任务优先级调度的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号