go 线程限制数量v1 --chatGPT

继上个问答

问:有A,B两个线程, A线程负责生成names,B线程负责runTask,如何实现A和B线程的数据交互

gpt:

在 Go 中可以使用通道(Channel)来实现线程(Goroutine)之间的数据交互。你可以创建一个通道用于 A 线程生成 `names` 并将其传递给 B 线程的 `runTask` 函数。下面是一个示例代码:

```go
package main

import (
    "fmt"
    "sync"
)

func worker(name string) {
    fmt.Printf("[%s] 执行任务\n", name)
}

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 generateNames(namesChan chan<- []string) {
    names := []string{"Worker1", "Worker2", "Worker3", "Worker4", "Worker5"} // 生成 names
    namesChan <- names
    close(namesChan) // 关闭通道,表示数据生成完成
}

func main() {
    namesChan := make(chan []string) // 创建一个通道用于传递 names
    limit := 2                      // 上限数量

    go generateNames(namesChan) // 启动 A 线程生成 names

    names := <-namesChan // 从通道中获取生成的 names
    runTask(names, limit) // 在 B 线程中使用生成的 names 执行任务
}
```

在这个示例中,我们创建了一个名为 `generateNames` 的函数,该函数负责生成 `names` 并将其发送到一个通道 `namesChan` 中。在 `main` 函数中,我们启动 A 线程来生成 `names`,然后通过通道传递给 B 线程的 `runTask` 函数。这样,A 和 B 线程之间就完成了数据交互。当 `generateNames` 函数完成后,我们关闭通道以通知 B 线程数据已经生成完成。

请注意,为了避免死锁,通道的发送操作应该在独立的 Goroutine 中进行,否则可能会导致阻塞。

你可能感兴趣的:(golang,开发语言,后端)