MST

星途 面试题库

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

在Go语言中,假设你有一个任务函数 `task`,你需要限制同时执行 `task` 的协程数量为5,使用信号量机制来实现,写出具体代码。
45.0万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "sync"
    "time"
)

func task(id int, semaphore chan struct{}, wg *sync.WaitGroup) {
    defer wg.Done()
    semaphore <- struct{}{} // 获取信号量
    defer func() { <-semaphore }() // 释放信号量

    fmt.Printf("Task %d is running\n", id)
    time.Sleep(time.Second)
    fmt.Printf("Task %d is done\n", id)
}

func main() {
    var wg sync.WaitGroup
    semaphore := make(chan struct{}, 5) // 初始化信号量,最多允许5个协程同时执行

    for i := 1; i <= 10; i++ {
        wg.Add(1)
        go task(i, semaphore, &wg)
    }

    wg.Wait()
}