MST
星途 面试题库

面试题:Go语言for循环与并发的高效协作

假设有一个任务数组,每个任务是对一个大文件进行特定的处理操作。请使用Go语言,结合for循环和goroutine并发处理这些任务,同时要确保资源合理利用,避免出现资源耗尽或数据竞争问题。简述实现思路和关键点。
38.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 定义任务结构体,包含大文件路径及处理操作相关信息。
  2. 创建任务数组,填充任务。
  3. 使用for循环启动goroutine处理任务。
  4. 利用sync.WaitGroup等待所有goroutine完成。
  5. 为避免数据竞争,对共享资源(如全局计数器等)操作使用sync.Mutex保护。
  6. 为避免资源耗尽,限制并发数,可使用带缓冲的通道控制同时运行的goroutine数量。

关键点

  1. 任务结构体设计:清晰定义任务所需参数,方便传递和处理。
  2. 同步机制sync.WaitGroup用于等待所有goroutine完成任务,确保程序在所有任务处理完毕后退出。sync.Mutex用于保护可能产生数据竞争的共享资源。
  3. 并发控制:通过带缓冲的通道限制同时运行的goroutine数量,避免资源耗尽。例如:semaphore := make(chan struct{}, maxConcurrent),在启动goroutinesemaphore <- struct{}{}获取信号量,goroutine结束时<-semaphore释放信号量。

示例代码

package main

import (
    "fmt"
    "sync"
)

// 定义任务结构体
type Task struct {
    filePath string
    // 其他处理操作相关字段
}

func processTask(task Task, wg *sync.WaitGroup, semaphore chan struct{}) {
    defer wg.Done()
    <-semaphore
    defer func() { semaphore <- struct{}{} }()

    // 实际的大文件处理操作
    fmt.Printf("Processing file: %s\n", task.filePath)
}

func main() {
    tasks := []Task{
        {filePath: "file1.txt"},
        {filePath: "file2.txt"},
        // 更多任务
    }

    var wg sync.WaitGroup
    maxConcurrent := 3 // 最大并发数
    semaphore := make(chan struct{}, maxConcurrent)

    for _, task := range tasks {
        wg.Add(1)
        go processTask(task, &wg, semaphore)
    }

    wg.Wait()
}