MST

星途 面试题库

面试题:Go语言并发任务调度系统之任务队列实现

在Go语言中实现一个简单的任务队列,用于并发任务调度系统。任务可以是任意的函数,要求能够将任务添加到队列中,并通过goroutine从队列中取出任务并执行。请描述你的实现思路,并给出核心代码示例。
22.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 使用一个通道(channel)来作为任务队列,用于存储待执行的任务。
  2. 创建若干个goroutine作为工作者(worker),这些工作者从任务队列中取出任务并执行。
  3. 提供一个函数用于向任务队列中添加任务。

核心代码示例

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 {}
}