MST
星途 面试题库

面试题:Go语言中如何实现高效的并发任务调度

在Go语言里,假设你有一组需要并发执行的任务,每个任务可能是一个简单的计算操作(比如计算斐波那契数列某一项的值),你需要尽可能高效地调度这些任务并获取它们的执行结果。请描述实现思路,并给出大致的代码框架。
49.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 任务封装:将每个任务(如计算斐波那契数列某一项的值)封装成一个函数。
  2. 使用goroutine:利用Go语言的goroutine来并发执行这些任务,每个任务对应一个goroutine。
  3. 使用channel:通过channel来传递任务结果,使得主线程可以从channel中获取每个任务的执行结果。
  4. 等待所有任务完成:使用sync.WaitGroup来等待所有goroutine完成任务,确保在获取所有结果之前程序不会提前退出。

代码框架

package main

import (
    "fmt"
    "sync"
)

// 计算斐波那契数列的函数
func fibonacci(n int) int {
    if n <= 1 {
        return n
    }
    return fibonacci(n - 1) + fibonacci(n - 2)
}

func main() {
    // 定义任务列表
    tasks := []int{3, 5, 7}
    var wg sync.WaitGroup
    resultChan := make(chan int)

    // 启动goroutine执行任务
    for _, task := range tasks {
        wg.Add(1)
        go func(n int) {
            defer wg.Done()
            result := fibonacci(n)
            resultChan <- result
        }(task)
    }

    // 另起一个goroutine来等待所有任务完成后关闭channel
    go func() {
        wg.Wait()
        close(resultChan)
    }()

    // 获取任务执行结果
    for result := range resultChan {
        fmt.Println("Result:", result)
    }
}