MST

星途 面试题库

面试题:Go工作池任务调度的负载均衡优化

假设我们有一个固定worker数量的Go工作池,任务的处理时间差异较大。请设计一种策略,实现工作池内任务的负载均衡,确保每个worker都能相对均匀地处理任务,提高整体的任务处理效率。并给出相应的代码实现思路和关键代码片段。
28.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

策略设计

  1. 任务队列:使用一个共享的任务队列,将所有待处理任务放入其中。
  2. 工作池:创建固定数量的worker,每个worker从任务队列中不断取出任务进行处理。
  3. 调度机制:采用公平调度算法,例如轮询调度,确保每个worker有均等机会获取任务。

代码实现思路

  1. 初始化任务队列:使用Go的channel来实现任务队列,channel本身是线程安全的。
  2. 启动worker:创建固定数量的goroutine作为worker,每个goroutine从任务队列中获取任务并处理。
  3. 任务分发:将任务发送到任务队列中,由worker自动获取处理。

关键代码片段

package main

import (
    "fmt"
)

// 定义任务结构体
type Task struct {
    ID int
    // 其他任务相关数据
}

func worker(id int, taskQueue <-chan Task) {
    for task := range taskQueue {
        fmt.Printf("Worker %d is processing task %d\n", id, task.ID)
        // 模拟任务处理
        // 实际应用中替换为真实任务处理逻辑
    }
    fmt.Printf("Worker %d stopped\n", id)
}

func main() {
    const numWorkers = 3
    const numTasks = 10

    taskQueue := make(chan Task, numTasks)

    // 启动worker
    for i := 0; i < numWorkers; i++ {
        go worker(i, taskQueue)
    }

    // 放入任务
    for i := 0; i < numTasks; i++ {
        taskQueue <- Task{ID: i}
    }

    close(taskQueue)

    // 等待所有worker完成任务,可使用sync.WaitGroup完善此部分
    select {}
}