MST

星途 面试题库

面试题:Go中如何实现简单的信号量控制并发

在Go语言中,假设你有一个任务队列,任务数量不定,你希望同时最多有3个任务并发执行。请用Go语言代码实现这一需求,使用信号量机制来控制并发数,并简要说明实现思路。
14.2万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

代码实现

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup
    semaphore := make(chan struct{}, 3)

    tasks := []func(){
        func() { fmt.Println("Task 1") },
        func() { fmt.Println("Task 2") },
        func() { fmt.Println("Task 3") },
        func() { fmt.Println("Task 4") },
        func() { fmt.Println("Task 5") },
    }

    for _, task := range tasks {
        wg.Add(1)
        semaphore <- struct{}{}
        go func(t func()) {
            defer func() {
                <-semaphore
                wg.Done()
            }()
            t()
        }(task)
    }

    wg.Wait()
}

实现思路

  1. 信号量创建:通过 make(chan struct{}, 3) 创建一个带缓冲的通道 semaphore 作为信号量,缓冲大小为3,表示最多允许3个任务同时执行。
  2. 任务处理:遍历任务队列,对每个任务,先调用 wg.Add(1) 增加等待组计数器,然后向信号量通道 semaphore 发送一个值。这一步如果通道已满(即已有3个任务在执行),则会阻塞,直到有任务完成并从通道中取出值。
  3. 任务执行:在goroutine中执行任务,任务完成后,从信号量通道 semaphore 取出一个值,以释放一个信号量,允许新的任务进入,同时调用 wg.Done() 减少等待组计数器。
  4. 等待任务完成:使用 wg.Wait() 等待所有任务完成,确保所有任务执行完毕后程序才退出。