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` 的值。文章来源地址https://uudwc.com/A/mN3Rj

原文地址:https://blog.csdn.net/glc22/article/details/133158177

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

h
上一篇 2023年09月23日 18:03
chatgpt赋能python:如何选取符合条件的Dataframe
下一篇 2023年09月23日 21:49