继上个问答
问:有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 线程数据已经生成完成。文章来源:https://uudwc.com/A/GdpxZ
请注意,为了避免死锁,通道的发送操作应该在独立的 Goroutine 中进行,否则可能会导致阻塞。文章来源地址https://uudwc.com/A/GdpxZ