MST

星途 面试题库

面试题:Go中如何基于channel实现简易的信号量控制高并发

在Go语言里,假设我们要限制同时运行的协程数量为5,利用channel来模拟信号量机制,实现一个函数`limitConcurrent`,该函数接收一个任务函数`task`和任务数量`numTasks`,要求按顺序启动`numTasks`个任务,且同一时间最多5个任务在运行。
22.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "sync"
)

func limitConcurrent(task func(int), numTasks int) {
    semaphore := make(chan struct{}, 5)
    var wg sync.WaitGroup

    for i := 0; i < numTasks; i++ {
        semaphore <- struct{}{}
        wg.Add(1)
        go func(index int) {
            defer func() {
                <-semaphore
                wg.Done()
            }()
            task(index)
        }(i)
    }

    wg.Wait()
}