MST

星途 面试题库

面试题:Go并发应用中如何使用Worker Pool模式

请阐述在Go语言的并发应用里,Worker Pool模式的原理,并编写一段简单的代码示例来展示该模式的实现,其中需要创建一定数量的worker goroutine,接收任务并处理。
38.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

Worker Pool模式原理

Worker Pool模式是一种并发设计模式,它通过维护一个固定数量的工作者(worker)goroutine池,这些工作者从任务队列中取出任务并执行。这样可以有效控制并发度,避免创建过多的goroutine导致资源耗尽。任务队列作为缓冲区,暂存待处理的任务。工作者不断从队列中获取任务,执行完成后再获取新任务,直到任务队列为空或程序结束。

代码示例

package main

import (
    "fmt"
)

// 定义任务结构体
type Task struct {
    ID int
}

// 工作者函数,处理任务
func worker(id int, taskChan <-chan Task) {
    for task := range taskChan {
        fmt.Printf("Worker %d is processing task %d\n", id, task.ID)
    }
}

func main() {
    const workerCount = 3
    const taskCount = 5

    taskChan := make(chan Task)

    // 创建工作者
    for i := 1; i <= workerCount; i++ {
        go worker(i, taskChan)
    }

    // 提交任务
    for i := 1; i <= taskCount; i++ {
        taskChan <- Task{ID: i}
    }

    // 关闭任务通道,告知工作者没有更多任务
    close(taskChan)

    // 等待所有任务完成,这里简单睡眠模拟,实际应用中可能需要更复杂的同步机制
    select {}
}

在上述代码中:

  1. 定义了 Task 结构体表示任务。
  2. worker 函数作为工作者,从 taskChan 中接收任务并处理。
  3. main 函数中,创建了固定数量的工作者goroutine,并向任务通道 taskChan 提交任务,最后关闭任务通道,防止工作者goroutine阻塞。