go 线程限制数量 --chatGPT
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
问runTask(names, limit), 遍历启动以names的子名称的工作线程 name测试打印上限数量是limit, 要求打印所有names
gpt:
你可以使用 Go 协程来实现 `runTask` 函数该函数会遍历启动以 `names` 子名称的工作线程并在达到上限数量 `limit` 后等待所有工作线程完成。以下是一个示例代码
```go
package main
import (
"fmt"
"sync"
"time"
)
func worker(name string) {
for i := 0; i < 3; i++ { // 模拟工作线程执行3次
fmt.Printf("[%s] 执行任务 %d\n", name, i)
time.Sleep(time.Second)
}
}
func runTask(names []string, limit int) {
var wg sync.WaitGroup
semaphore := make(chan struct{}, limit)
for _, name := range names {
semaphore <- struct{}{} // 占用一个信号量
wg.Add(1)
go func(name string) {
defer func() {
<-semaphore // 释放信号量
wg.Done()
}()
worker(name)
}(name)
}
wg.Wait()
}
func main() {
names := []string{"Worker1", "Worker2", "Worker3", "Worker4", "Worker5"}
limit := 2 // 上限数量
runTask(names, limit)
}
```
在这个示例中我们定义了 `worker` 函数来模拟工作线程的工作。`runTask` 函数接收一个包含工作线程名称的切片 `names` 和一个上限数量 `limit`。它使用信号量来控制并发并等待所有工作线程完成。
在 `main` 函数中我们定义了一个包含工作线程名称的切片 `names`并指定了上限数量 `limit`。然后我们调用 `runTask` 函数来启动工作线程并在达到上限数量后等待它们完成。你可以根据需要修改 `names` 和 `limit` 的值。