go 线程限制数量 --chatGPT

问: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` 的值。

相关推荐
Olrookie2 分钟前
若依前后端分离版学习笔记(二十)——实现滑块验证码(vue3)
java·前端·笔记·后端·学习·vue·ruoyi
LucianaiB18 分钟前
招聘可以AI面试,那么我制作了一个AI面试教练不过分吧
后端
CoderCodingNo44 分钟前
【GESP】C++五级考试大纲知识点梳理, (5) 算法复杂度估算(多项式、对数)
开发语言·c++·算法
无奈何杨1 小时前
CoolGuard更新,ip2region升级、名单增加过期时间
后端
ftpeak1 小时前
JavaScript性能优化实战
开发语言·javascript·性能优化
一个很帅的帅哥2 小时前
JavaScript事件循环
开发语言·前端·javascript
驰羽2 小时前
[GO]gin框架:ShouldBindJSON与其他常见绑定方法
开发语言·golang·gin
摇滚侠2 小时前
Spring Boot 3零基础教程,WEB 开发 自定义静态资源目录 笔记31
spring boot·笔记·后端·spring
Anthony_49262 小时前
逻辑清晰地梳理Golang Context
后端·go
程序员大雄学编程2 小时前
「用Python来学微积分」5. 曲线的极坐标方程
开发语言·python·微积分