Go 之缓冲通道限制协程并发数目

并发执行的协程太多可能会对系统资源的消耗特别大,从而导致其它进程服务受到影响,因此协程执行时应该设计一种机制,来限制并发执行的协程数目。

其中 WaitGroup 主要用作协程同步,当所有协程都执行完毕以后,才会结束主线程。每个任务开始执行前,都会先往缓冲通道写入空结构体数据(用于占位),如果通道已满,则会阻塞,直到通道数据被其他协程取出释放后当前协程才可以继续执行。

package mainimport ("fmt""sync""time"
)func worker(id int, sem chan struct{}) {sem <- struct{}{}defer func() {<-sem}()fmt.Printf("%s: Worker %d starting...\n", time.Now().Format("2006-01-02 15:04:05"), id)time.Sleep(2 * time.Second)fmt.Printf("Worker %d done\n", id)
}func main() {concurrency := 3sem := make(chan struct{}, concurrency)var wg sync.WaitGroupfor i := 0; i < 10; i++ {wg.Add(1)go func(id int) {defer wg.Done()worker(id, sem)}(i)}wg.Wait()close(sem)
}
2024-04-09 09:27:25: Worker 1 starting...
2024-04-09 09:27:25: Worker 3 starting...
2024-04-09 09:27:25: Worker 0 starting...
Worker 3 done
Worker 0 done
2024-04-09 09:27:27: Worker 4 starting...
2024-04-09 09:27:27: Worker 2 starting...
Worker 1 done
2024-04-09 09:27:27: Worker 5 starting...
Worker 5 done
2024-04-09 09:27:29: Worker 6 starting...
Worker 4 done
2024-04-09 09:27:29: Worker 9 starting...
Worker 2 done
2024-04-09 09:27:29: Worker 8 starting...
Worker 6 done
Worker 9 done
Worker 8 done
2024-04-09 09:27:31: Worker 7 starting...
Worker 7 done

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

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

相关文章

高颜值高性能的开源免费自托管照片和视频备份方案:Immich

Immich&#xff1a;安全存储您的珍贵记忆&#xff0c;高颜值且高性能的自托管照片与视频备份解决方案&#xff0c;让您随时随地无忧回顾美好时光。- 精选真开源&#xff0c;释放新价值。 概览 在数字化时代&#xff0c;我们的照片和视频越来越多&#xff0c;如何安全、有效地备…

【IC前端虚拟项目】SDC文件编写与DC综合环境组织

【IC前端虚拟项目】数据搬运指令处理模块前端实现虚拟项目说明-CSDN博客 好的终于来到了综合的环节,在此我们假设已经通过vcs和spyglass把lint问题清理干净了,那么dc综合也不会出现太大的波折。综合阶段我们可以分为三个小的过程: 1.综合前——sdc编写; 2.综合中——dc综…

函数参数的类型

在Python中&#xff0c;函数参数的类型可以是以下几种&#xff1a; 位置参数&#xff08;Positional Arguments&#xff09;&#xff1a; 位置参数是最常见的函数参数类型&#xff0c;它们按照函数定义时参数的顺序来传递。当你调用一个函数时&#xff0c;你需要按照函数参数列…

solidworks镜像实体怎么用

在SolidWorks中&#xff0c;镜像实体功能用于复制并反转实体或特征&#xff0c;使其沿着指定的基准面对称。以下是使用SolidWorks镜像实体的基本步骤&#xff1a; 1. 打开模型&#xff1a;首先打开SolidWorks软件&#xff0c;并加载您想要镜像的三维实体模型。 2. 找到镜像命…

Linux服务器额外安装Python3环境

服务器配置 服务器&#xff1a;CentOS Linux 版本: 7 已安装python: 2.x 新建文件夹 另外新建文件夹&#xff0c;作为单独环境 这里在默认根目录新建文件夹&#xff0c;python3 下载PYTHON 可以手动下载对应版本&#xff0c;之后上传服务器中对应的文件夹。 或者使用网址下…

揭秘操作系统:核心功能与Linux系统解析

1.引言 在先前探讨中&#xff0c;我们了解到计算机主机内部的硬件资源需要一种高效管控手段&#xff0c;由此催生了操作系统的诞生。操作系统&#xff08;Operating System&#xff0c;简称OS&#xff09;&#xff0c;是计算机生态系统中不可或缺的核心组件&#xff0c;以其复杂…

TypeScript常用知识点整理

介绍 TypeScript 是 JavaScript 的一个超集&#xff0c;添加了静态类型支持和更多现代编程特性&#xff0c;提高了代码的可靠性和可维护性。最终会被编译成标准的 JavaScript 代码运行。 使用npm install -g typescript进行全局安装 将编写好的ts代码进行运行&#xff0c;第…

Linux文件查找命令详解——以CentOS为例

Linux文件查找命令详解——以CentOS为例 在Linux系统中&#xff0c;文件查找是一项非常重要的任务。无论是系统管理员还是普通用户&#xff0c;都需要掌握一些基本的文件查找命令。本文将详细介绍Linux中常用的文件查找命令&#xff0c;并以CentOS为例&#xff0c;展示如何使用…

深入IPCWeb-Backend:构建高效的工业过程控制Web后端系统

引言 在工业过程控制&#xff08;Industrial Process Control, IPC&#xff09;系统中&#xff0c;实时数据的监控、处理和分析至关重要。随着物联网&#xff08;IoT&#xff09;技术和云计算的发展&#xff0c;工业过程控制系统也日益依赖于Web技术来提升其连接性和可访问性。…

加密软件如何给文件加密

加密软件如何给文件加密 市面上有很多给文件加密的软件&#xff0c;它是如何给文件加密的呢&#xff1f;加密过程是否安全&#xff0c;效果是否理想呢&#xff1f;下面以安企神软件为例给大家介绍 给文件加密的关键步骤和技术。 1、选择加密算法 安企神软件可能会采用国际公…

如何彻底删除node和npm

如何彻底删除node和npm 前言&#xff1a; 最近做个项目把本地的node更新了&#xff0c;之前是v10.14.2更新至v16.14.0 &#xff0c;想着把之前的项目起来下&#xff0c;执行npm install 结果启动不了&#xff0c;一直报npm版本不匹配需要更新本地库异常… 找了几天发现是npm 和…

AI大模型探索之路-基础篇3:构建Chat Completions驱动的多轮对话机器人

文章目录 前言一、初步测试二、读取本地知识库三、问答测试四、实现多轮对话总结 前言 在上一篇《AI大模型应用开发篇之Chat Completions API》中熟悉了 Chat Completions API相关特点和各种场景的使用样例&#xff1b; 本章主要记录如何基于Chat Completions API实现简单的多…

fastjson list转json

1&#xff0c;内容是字符串 String json JSON. toJSONString(list); 结果:["111" ,“222”] 2,内容是时间 SerializeConfig config new SerializeConfig(); config. put(Date.class, new SimpleDateFormatSerializer("yyyy-MM-dd HH:mm:ss")); Strin…

【数据结构与算法】:快速排序和归并排序的非递归实现

1. 递归实现的缺陷 在以前的文章中我们把快速排序和归并排序的递归实现方式进行了介绍&#xff0c;但是在校招面试和在企业的日常开发过程中&#xff0c;仅掌握递归方法是不够的&#xff0c;因为递归也有它的缺陷。 我们知道在函数调用过程中会在内存中建立栈帧&#xff0c;栈…

solidity(3)

地址类型 pragma solidity ^0.8.0;contract AddressExample {// 地址address public _address 0x7A58c0Be72BE218B41C608b7Fe7C5bB630736C71;address payable public _address1 payable(_address); // payable address&#xff0c;可以转账、查余额// 地址类型的成员uint256…

C语言流程控制

程序三大结构&#xff1a;顺序&#xff0c;选择&#xff0c;循环 NS图&#xff0c;流程图&#xff0c;工具Dia 简单结构与复杂结构&#xff1a;自然流程 goto跳转 无条件跳转&#xff0c;可以跳转代码到指定的位置&#xff08;慎用&#xff0c;无条件跳转&#xff0c;不能…

C/C++与Python:各自的优势与前景展望

在讨论C/C和Python这两种编程语言的前景时&#xff0c;我们必须认识到每种语言都有其独特的定位和应用场景&#xff0c;并不存在绝对意义上的“谁更有前景”。它们分别在不同的领域发挥着重要作用&#xff0c;而且在未来的技术发展过程中&#xff0c;二者都将继续保持其不可替代…

Linux进程间通信【二】

system V进程间通信 管道通信本质是基于文件的&#xff0c;也就是说操作系统并没有为此做过多的设计工作&#xff0c;而system V IPC是操作系统特地设计的一种通信方式。但是不管怎么样&#xff0c;它们的本质都是一样的&#xff0c;都是在想尽办法让不同的进程看到同一份由操…

js中Promise的常见用法 比如resolve、race都是啥意思

在JavaScript中&#xff0c;Promise是一种用于异步编程的构造函数&#xff0c;它提供了更好的处理异步操作的方式&#xff0c;相较于传统的回调函数更易于管理和避免回调地狱。Promise有三种状态&#xff1a;Pending&#xff08;进行中&#xff09;、Resolved&#xff08;已完成…

【深度学习】海洋生物数据集,图片分类

文章目录 任务描述数据收集数据处理模型训练指标评测web app代码和帮助 任务描述 收集9种以上的海洋生物图片&#xff0c;然后基于深度学习做一个分类模型&#xff0c;训练完成后&#xff0c;分类模型就可以对未知图片进行分类。 在之后随便传一张图片&#xff0c;分类模型就…