0


go 线程限制数量v1 --chatGPT

继上个问答

问:有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 中进行,否则可能会导致阻塞。


本文转载自: https://blog.csdn.net/glc22/article/details/133158667
版权归原作者 宇文仲竹 所有, 如有侵权,请联系我们删除。

“go 线程限制数量v1 --chatGPT”的评论:

还没有评论