继上个问答
问:有A,B两个线程, A线程负责生成names,B线程负责runTask,如何实现A和B线程的数据交互
gpt:
在 Go 中可以使用通道(Channel)来实现线程(Goroutine)之间的数据交互。你可以创建一个通道用于 A 线程生成 names
并将其传递给 B 线程的 runTask
函数。下面是一个示例代码:
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 中进行,否则可能会导致阻塞。
版权归原作者 宇文仲竹 所有, 如有侵权,请联系我们删除。