go并发模式之----阻塞/屏障模式

news2024/10/7 16:26:40

常见模式之一:阻塞/屏障模式

定义

顾名思义,就是阻塞等待所有goroutine,直到所有goroutine完成,聚合所有结果

使用场景

  • 多个网络请求,聚合结果

  • 大任务拆分成多个子任务,聚合结果

示例

package main
​
import (
  "fmt"
  "time"
)
​
func task1(n int, res chan int) {
  time.Sleep(time.Millisecond * 30)
  res <- n * n
}
​
func task2(n int, res chan int) {
  time.Sleep(time.Millisecond * 10)
  res <- n + n
}
​
func task3(n int, res chan int) {
  time.Sleep(time.Millisecond * 20)
  res <- n / n
}
​
func main() {
  res := make(chan int, 3)
  defer close(res)
  go task1(2, res)
  go task2(3, res)
  go task3(4, res)
  var resArr []int
  for i := 0; i < 3; i++ {
    resArr = append(resArr, <-res)
  }
  fmt.Println(resArr)
}

打印结果:

[6 1 4]

特殊使用

当我们并发请求,但是聚合结果时,需要顺序给出, 如上例,我们打印想要按照task1,task2,task3 依次给出

可以结合slice 和 和结果收集结构体 改写如下

package main
​
import (
  "fmt"
  "time"
)
​
func task1(n int, res chan ResultMap) {
  time.Sleep(time.Millisecond * 30)
  res <- ResultMap{
    Key: "task1", 
    Res: n * n,
  }
}
​
func task2(n int, res chan ResultMap) {
  time.Sleep(time.Millisecond * 10)
  res <- ResultMap{
    Key: "task2", 
    Res: n + n,
  }
}
​
func task3(n int, res chan ResultMap) {
  time.Sleep(time.Millisecond * 20)
  res <- ResultMap{
    Key: "task3", 
    Res: n / n,
  }
}
​
type ResultMap struct {
  Key string
  Res int
}
​
func main() {
  taskList := []string{"task1", "task2", "task3"}
  res := make(chan ResultMap, 3)
  defer close(res)
  go task1(2, res)
  go task2(3, res)
  go task3(4, res)
  var resArr []int
  l := len(taskList)
  collectMap := make(map[string]int)
  for i := 0; i < l; i++ {
    tmp := <-res
    collectMap[tmp.Key] = tmp.Res
  }
  for _, vv := range taskList {
    resArr = append(resArr, collectMap[vv])
  }
  fmt.Println(resArr)
}
​如果有更好的顺序收集结果方式,欢迎评论区指正

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1479523.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

两台电脑异地怎么共享文件?

在现代社会中&#xff0c;无论是个人用户还是企事业单位&#xff0c;都经常面临着跨地域的文件共享需求。由于各种限制和条件的限制&#xff0c;如网络环境、设备限制等&#xff0c;可能导致文件共享变得非常困难。本文将介绍一款名为【天联】的组网产品&#xff0c;通过它可以…

mysql快速生成1000万的测试数据

创建存储过程 DELIMITER //CREATE PROCEDURE generate_data() BEGINDECLARE i INT DEFAULT 1;-- 创建表CREATE TABLE IF NOT EXISTS test_table (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255),age INT,email VARCHAR(255));-- 插入1000万行数据WHILE i < 10000000…

Zynq—AD9238数据采集DDR3缓存千兆以太网发送实验(前导)

ACM9238 高速双通道ADC模块自助服务手册AD9238 Zynq—AD9238数据采集DDR3缓存千兆以太网发送实验&#xff08;一&#xff09;-CSDN博客 一、AD9238 模块在各方面参数性能上与AD9226保持一致。但是在设计上优化了信号调理电路&#xff0c;将单端信号先转成差分信号&#xff0c…

新闻稿软文投放推广发布需要注意什么

在全球化的背景下&#xff0c;各国之间的联系与互动变得越来越频繁。无论是经济、文化还是科技领域&#xff0c;各国之间的交流和合作都在不断加深。而在这个信息爆炸的互联网时代&#xff0c;人们获取信息的主要途径也逐渐转向了网络。 在这种情况下&#xff0c;软文推广成为…

node 之 解决下包速度慢的问题

1.为什么下包速度慢 在使用 npm 下包的时候,默认从国外的https://registry.npmis.org/ 服务器进行下载&#xff0c;此时&#xff0c;网络数据的传输需要经过漫长的海底光缆&#xff0c;因此下包速度会很慢。 2.淘宝npm 镜像服务器 淘宝在国内搭建了一个服务器&#xff0c;专门把…

Unity之ConversaDialogueSystem 对话插件使用

一、插件下载或购买 官方购买地址&#xff1a;Conversa Dialogue System | 可视化脚本 | Unity Asset Store 百度网盘地址&#xff1a;提取码&#xff1a;syq1 此插件没有官方案例&#xff0c;插件作者也明确回复说后期不会出教程&#xff0c;所以此教程根据插件demo案例进行学…

QT C++实践|超详细数据库的连接和增删改查操作|附源码

0&#xff1a;前言 &#x1faa7; 什么情况需要数据库? 1 大规模的数据需要处理&#xff08;比如上千上万的数据量&#xff09;2 需要把数据信息存储起来&#xff0c;无论是本地还是服务上&#xff0c;而不是断电后数据信息就消失了。 如果不是上面的原因化&#xff0c;一般…

计算机网络-典型网络组网架构

前面基本网络知识已经能够满足中小企业的需要了&#xff0c;今天来看下一些基本网络组网架构。 首先网络是分层架构&#xff0c;从接入层到汇聚层再到核心层&#xff0c;然后接入运营商出口。内部包括有线网络、无线网络&#xff0c;出口一般可以使用路由器或者防火墙进行安全防…

人才测评工具 找准需求才能测出效果

怎么挖掘人才&#xff1f;怎么利用人才&#xff1f; 让每个员工发挥出最大的优势&#xff1f; 让每个员工奋斗在最适合的岗位&#xff1f; 每个HRer都考虑过&#xff0c;每个HR也都有自己独特的见解。 1、找准测评目的 我们都希望测评是全面的&#xff0c;360度的。要是仔…

有多少成年人学英语,全靠八卦和腹肌?

昨个儿&#xff0c;“知识大航海”群里针对老龄化问题讨论的非常激烈。 我挺喜欢这种氛围的&#xff0c;只要大家不将争论上升到地域歧视人身攻击就可以。 很多事情没有绝对的对与错&#xff0c;经过计论&#xff0c;能够开悟心智&#xff0c;这未尝不是一件好事呀。 最后&…

“平民化”非结构数据处理

在全球信息产业高速发展的背景下&#xff0c;IDC预测&#xff0c;2018 到 2025 年之间&#xff0c;全球产生的数据量将会从 33 ZB 增长到 175 ZB&#xff0c; 复合增长率27%&#xff0c;其中超过 80%的数据都会是处理难度较大的非结构化数据&#xff0c;如文档、文本、图形、图…

32-树-在每个树行中找最大值

这是树的第32篇算法&#xff0c;力扣链接。 给定一棵二叉树的根节点 root &#xff0c;请找出该二叉树中每一层的最大值。 示例1&#xff1a; 输入: root [1,3,2,5,3,null,9] 输出: [1,3,9] 层级遍历似乎天生适合解这道题&#xff1a; func largestValues(root *TreeNode) []…

实例:NX二次开发抽取平面以及标准柱面中心线

一、概述 最近体验许多外挂&#xff0c;包括胡波外挂、星空外挂及模圣等都有抽取面的中心线&#xff0c;由于刚刚学习&#xff0c;我尝试看看能不能做出来&#xff0c;本博客代码没有封装函数&#xff0c;代码有待改进&#xff0c;但基本可以实现相应的功能。 二、案例实现的功…

浅谈MySQL的B树索引与索引优化

MySQL的MyISAM、InnoDB引擎默认均使用B树索引&#xff08;查询时都显示为“BTREE”&#xff09;&#xff0c;本文讨论两个问题&#xff1a; 为什么MySQL等主流数据库选择B树的索引结构&#xff1f;如何基于索引结构&#xff0c;理解常见的MySQL索引优化思路&#xff1f; 为什…

火锅底料加工厂污废水如何处理达标排放

火锅底料加工厂作为食品加工行业的一员&#xff0c;其生产过程中不可避免地会产生大量的污废水。为了保护环境和维护公共健康&#xff0c;火锅底料加工厂应当采取措施对污废水进行处理&#xff0c;使其达到国家相关排放标准。那么&#xff0c;火锅底料加工厂污废水该如何处理才…

ffmpeg单张图片生成固定时长的视频

ffmpeg -r 25 -f image2 -loop 1 -i fps_1.jpg -vcodec libx264 -pix_fmt yuv420p -s 1080*1920 -r 25 -t 30 -y fps.mp4这个命令将 fps_1.jpg 图片转换为一个 30 秒长的视频&#xff0c;分辨率为 1920x1080&#xff0c;帧率为 25 帧/秒&#xff0c;并使用 libx264 编码器进行压…

数据中心GPU集群高性能组网技术分析

数据中心GPU集群组网技术是指将多个GPU设备连接在一起&#xff0c;形成一个高性能计算的集群系统。通过集群组网技术&#xff0c;可以实现多个GPU设备之间的协同计算&#xff0c;提供更大规模的计算能力&#xff0c;适用于需要大规模并行计算的应用场景。 常用的组网技术&…

HTML5+CSS3小实例:环绕小球弹性loading动画

实例:环绕小球弹性loading动画 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge&quo…

C# WPF编程-创建项目

1.创建新项目 选择“WPF应用程序”》“下一步” 2. 设置项目 设置项目名称&#xff0c;保存位置等参数>下一步 3.选择框架 4.项目创建成功 5.运行项目

Failed to build tree: parent link [base_link] of joint [lidar_joint] not found

参考&#xff1a; Failed to build tree: parent link [base_link] of joint 在古月居gazebo 的基础教程里&#xff0c;运行古月居的mbot的launch文件报错&#xff0c;小机器人不出现。 主要原因是提供的xacro文件的宏定义没有放在xacro的命名空间。 解决&#xff1a; 将<mb…