码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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 中进行,否则可能会导致阻塞。

  • 相关阅读:
    2021年06月 Python(一级)真题解析#中国电子学会#全国青少年软件编程等级考试
    【Linux】安装VMWare虚拟机(安装配置)和配置Windows Server 2012 R2(安装配置连接vm虚拟机)以及环境配置
    DolphinDB 四大因子库合集
    abap代码优化和性能调优工具
    javascript高级(4)
    GTK实现水波纹效果
    基于事件触发机制的孤岛微电网二次电压与频率协同控制MATLAB仿真模型
    AI算法检测对无人军用车辆的MitM攻击
    SPA项目开发之首页导航+左侧菜单
    软考高级系统分析师考试2022论文考了些啥?改为二选一
  • 原文地址:https://blog.csdn.net/glc22/article/details/133158667
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号