Golang开发--Goroutine的使用
Go 语言天生支持并发编程,提供了丰富的原语和工具来编写并发程序。Goroutine 是 Go 语言中的轻量级执行单位。它们是由 Go 运行时(runtime)管理的,并且能够在单个线程上运行成千上万个 Goroutine。创建 Goroutine 非常高效,可以通过使用关键字 go 启动一个新的 Goroutine。例如,go myFunction() 将 myFunction 作为一个 Goroutine 启动。
1.并发与并行:
并发是指同时处理多个任务的能力,而并行是指同时执行多个任务的能力。Go 语言通过 Goroutine 实现并发编程,可以轻松地创建和管理大量的 Goroutine。同时,Go 语言的运行时系统会在多个物理线程上调度 Goroutine,实现并行执行,以充分利用多核处理器的性能。
2.Channel:
通道(channel)是 Goroutine 之间进行通信和同步的关键机制。通道提供了安全的数据传输和共享的方式。Goroutine 可以通过通道发送和接收数据,从而实现协调和共享数据。通过使用通道,可以避免显式的锁和条件变量,从而简化并发编程。
3.并发安全:
Go 语言通过设计和约定来鼓励并发安全的编程。其中一个重要原则是不要通过共享内存来通信,而是通过通道来共享数据。通道的发送和接收操作在不同 Goroutine 之间提供了隐式的同步,避免了竞态条件和数据竞争。
4.同步原语:
Go 语言提供了丰富的同步原语来协调 Goroutine 的执行。其中包括互斥锁(Mutex)、读写锁(RWMutex)、条件变量(Cond)等。这些原语可以用于保护共享资源的访问,实现互斥和同步。
5.原子操作:
Go 语言提供了原子操作来执行不可分割的操作,从而避免竞态条件。原子操作可以保证在并发环境中对共享变量的读取和写入是原子性的,不会被中断。这些原子操作可以通过 sync/atomic 包进行使用。
6.Select 语句:
```select 是 Go 语言中用于处理多个通道操作的语句。它可以同时监听多个通道的发送和接收操作,当其中任意一个操作准备就绪时,select 语句将执行相应的操作。select` 语句可以用于实现非阻塞的通信、超时控制和多路复用等场景。
7.WaitGroup:
```sync.WaitGroup是 Go 语言中的一个同步原语,用于等待一组 Goroutine 完成执行。它可以用于在主程序中等待所有 Goroutine 完成后再继续执行。通过Add、Done和Wait` 方法,可以方便地管理 Goroutine 的并发执行。
通过以上的特性和工具,Go 语言提供了一种简洁而强大的方式来编写并发程序。它使得开发人员能够更轻松地实现并发、并行和多任务处理,从而充分利用多核处理器的性能,并提高程序的响应性和吞吐量。然而,在编写并发程序时,需要小心处理共享资源和同步问题,以确保程序的正确性和稳定性。
启动 Goroutine:
package mainimport ("fmt""time"
)func printNumbers() {for i := 1; i <= 5; i++ {fmt.Println(i)time.Sleep(500 * time.Millisecond)}
}func printLetters() {for i := 'a'; i <= 'e'; i++ {fmt.Println(string(i))time.Sleep(500 * time.Millisecond)}
}func main() {go printNumbers()go printLetters()// 等待一段时间,以便 Goroutine 有足够的时间执行time.Sleep(3 * time.Second)fmt.Println("主程序结束")
}
在上述示例中,我们定义了两个函数 printNumbers 和 printLetters,它们分别打印数字和字母。通过使用关键字 go,我们在 main 函数中启动了两个 Goroutine 来执行这两个函数。主程序等待一段时间后结束,这给了 Goroutine 充足的时间来执行打印操作。
使用通道进行通信:
package mainimport ("fmt""time"
)func worker(id int, jobs <-chan int, results chan<- int) {for job := range jobs {fmt.Printf("Worker %d 开始处理任务 %d\n", id, job)time.Sleep(1 * time.Second)fmt.Printf("Worker %d 完成任务 %d\n", id, job)results <- job * 2}
}func main() {jobs := make(chan int, 5)results := make(chan int, 5)// 启动三个工作协程for i := 1; i <= 3; i++ {go worker(i, jobs, results)}// 发送任务到通道for i := 1; i <= 5; i++ {jobs <- i}close(jobs)// 接收工作协程处理结果for i := 1; i <= 5; i++ {result := <-resultsfmt.Println("任务结果:", result)}
}
在上述示例中,我们创建了两个通道 jobs 和 results,分别用于发送任务和接收结果。我们启动了三个工作协程(Goroutine)来处理任务。主程序将任务发送到 jobs 通道中,工作协程从 jobs 通道接收任务并处理,然后将结果发送到 results 通道中。主程序从 results 通道接收结果并打印。
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
Golang开发--Goroutine的使用
Go 语言天生支持并发编程,提供了丰富的原语和工具来编写并发程序。Goroutine 是 Go 语言中的轻量级执行单位。它们是由 Go 运行时(runtime)管理的,并且能够在单个线程上运行成千上万个 Goroutine。创建 Goroutine 非常高效&#x…...
![](https://www.ngui.cc/images/no-images.jpg)
【Linux】package ‘python-yaml‘ has no installation candidate 如何解决
要解决此问题,可以尝试以下几个步骤: 确保系统已经更新到最新版本。可以使用以下命令进行系统更新: sudo apt update sudo apt upgrade确保您的软件源列表中包含了正确的软件源。可以使用以下命令编辑软件源列表: sudo nano /etc/…...
![](https://www.ngui.cc/images/no-images.jpg)
Selector选择器在AspNetCore中的用法
Selector选择器在AspNetCore中的用法 背景 项目编辑过程中会选择其所属的上级项目,而上级项目在数据结构中是以ParentID的方式表达,而非Project类型,用户不会记录也不应该记录ID值,因此应提供Selector项目下拉框供用户选择。 但…...
![](https://img-blog.csdnimg.cn/d7e8ff4642ea4fd790db223118b92f1c.png)
anaconda3最新版安装|使用详情|Error: Please select a valid Python interpreter
Win11查看安装的Python路径及安装的库 anaconda3最新版安装|使用详情|Error: Please select a valid Python interpreter 介绍开源包管理系统和环境管理系统 ,包括多种语言的包安装,运行,更新,删除,最重要的是可以解…...
![](https://www.ngui.cc/images/no-images.jpg)
java八股文面试[多线程]——锁的分类
1.1 可重入锁、不可重入锁 Java中提供的synchronized,ReentrantLock,ReentrantReadWriteLock都是可重入锁。 重入:当前线程获取到A锁,在获取之后尝试再次获取A锁是可以直接拿到的。 不可重入:当前线程获取到A锁&…...
![](https://img-blog.csdnimg.cn/aa605302508b42d999f817dcc71628c3.png)
儿童安全门和围栏,以及游戏围栏等美国站要求的合规标准是什么?
儿童安全门和围栏 儿童安全门和围栏用于在门口(如门道)内设置围栏,或用作自支撑围栏,将幼儿可能在其中活动的区域围起来。这些商品可能由塑料、金属、乙烯树脂或木制组件等材料制成。此政策包括但不限于可扩展围栏、伸缩安全门和…...
![](https://www.ngui.cc/images/no-images.jpg)
kafka配合ElasticStack技术栈的搭配使用
今日内容: - kafka生产环境调优; - kafka配合ElasticStack技术栈的搭配使用; - zookeeper集群部署; - zookeeper的ACL; - zookeeper的调优; - PB级别项目; - ES8集群搭建/elk; (待定...) 订阅1个的topic: 老男孩: 10 多个不同的主题…...
![](https://img-blog.csdnimg.cn/b8ab9974c102475c99984ffcce7e52e9.png)
对极几何与三角化求3D空间坐标
一,使用对极几何约束求R,T 第一步:特征匹配。提取出有效的匹配点 void find_feature_matches(const Mat &img_1, const Mat &img_2,std::vector<KeyPoint> &keypoints_1,std::vector<KeyPoint> &keypoints_2,std::vector&l…...
![](https://www.ngui.cc/images/no-images.jpg)
英语语法笔记
1.英语五大句型 主谓(主语动词) 主谓宾(主语动词宾语) 主谓宾宾(主语动词简接宾语直接宾语) 主谓宾补(主语动词宾语宾语补语) 主系表(主语系动词主语补语) 1…...
![](https://img-blog.csdnimg.cn/66a66efd3f474a7e81918e0057a84292.png)
ES6的面向对象编程以及ES6中的类和对象
一、面向对象 1、面向对象 (1)是一种开发思想,并不是具体的一种技术 (2)一切事物均为对象,在项目中主要是对象的分工协作 2、对象的特征 (1)对象是属性和行为的结合体 &#x…...
![](https://www.ngui.cc/images/no-images.jpg)
ConfigMaps in K8s
摘要 ConfigMaps是Kubernetes(K8s)中用于存储应用程序配置信息的一种资源对象。它将key-value对存储为Kubernetes集群中的一个资源,并可以在Pod中以卷或环境变量的形式使用。 ConfigMaps的设计目的是将应用程序配置与应用程序本身解耦。它可…...
![](https://img-blog.csdnimg.cn/c643553189c643b78ff10d72e3fb5d37.png)
《机器人学一(Robotics(1))》_台大林沛群 第 6 周 【轨迹规划_直线转折处抛物线平滑】Quiz 6
步骤: 1、 编程 将PPT 的例子 跑一遍, 确保代码无误 2、根据题目 修改 相关参数 文章目录 求解代码_Python 解决的问题: 线段间转折点 的 速度 不连续 解决方法: 将直线段 两端 修正为 二次方程式 二次项圆滑 求解代码_Python …...
![](https://img-blog.csdnimg.cn/89b488450caa481e80f50b4369237c78.png)
关于vscode的GitLens插件里的FILE HISTORY理解
最近在用vscode的GitLens插件开发项目遇到这个疑问,先看图: 每当我点击FILE HISTORY 一个commit时,正常来说显示器会自动将点击的提交版本和它上一个提交版本进行比较,如果单纯这么理解的话就错了,因为GitLens的File …...
![](https://img-blog.csdnimg.cn/img_convert/964d7d1b8309a8180dd52d7465fd384a.png)
通过idea实现springboot集成mybatys
概述 使用springboot 集成 mybatys后,通过http请求接口,使得通过http请求可以直接直接操作数据库; 完成后端功能框架;前端是准备上小程序,调用https的请求接口用。简单实现后端框架; 详细 springboot 集…...
![](https://www.ngui.cc/images/no-images.jpg)
力扣(LeetCode)算法_C++——移位字符串分组
给定一个字符串,对该字符串可以进行 “移位” 的操作,也就是将字符串中每个字母都变为其在字母表中后续的字母,比如:“abc” -> “bcd”。这样,我们可以持续进行 “移位” 操作,从而生成如下移位序列&am…...
![](https://www.ngui.cc/images/no-images.jpg)
Vue2 与Vue3的区别?面试题
Vue 2和Vue 3是Vue.js框架的不同版本,在面试中经常涉及到它们之间的区别。以下是Vue 2和Vue 3的主要区别: 性能提升:Vue 3在性能方面进行了优化。Vue 3引入了更高效的Diff算法,提高了渲染性能。此外,Vue 3还进行了代码…...
![](https://www.ngui.cc/images/no-images.jpg)
java代码:Random和Scanner应用的小例子-猜数字小游戏
//java代码:Random和Scanner应用的小例子-猜数字小游戏 package com.test; import java.util.Random; import java.util.Scanner; /* * 需求:猜数字小游戏。 * 系统产生一个1-100之间的随机数,请猜出这个数据是多少? * * 分析…...
![](https://img-blog.csdnimg.cn/feb8d32b9b2348c9a65aca166fe6978a.png)
python调用git出错:ImportError: Failed to initialize: Bad git executable.
报错信息 #报错信息 Traceback (most recent call last): File “”, line 1, in File “C:\Python27\lib\site-packages\git_init_.py”, line 85, in raise ImportError(‘Failed to initialize: {0}’.format(exc)) ImportError: Failed to initialize: Bad git executab…...
![](https://img-blog.csdnimg.cn/b5d41e65f8b64ff691775d437caef2b0.gif)
【C语言】入门——指针
目录 编辑 1.指针是什么 2.指针类型和指针运算 2.1指针-整数 2.2指针-指针 2.3指针的关系运算 3.野指针 3.1野指针成因 👍指针未初始化: 👍指针越界访问: 👍指针指向空间释放: 3.2如何规避野指针 …...
![](https://www.ngui.cc/images/no-images.jpg)
C#_预处理指令
1. 预处理器指令指导编译器在实际编译开始之前对信息进行预处理。 所有的预处理器指令都是以 # 开始。且在一行上,只有空白字符可以出现在预处理器指令之前。预处理器指令不是语句,所以它们不以分号(;)结束。 C# 编译器没有一个单…...
![](https://www.ngui.cc/images/no-images.jpg)
容器命令(docker)
文章目录 前言一、docker容器命令0、准备工作1、新建容器并启动2、退出容器3、列出所有的运行的容器4、删除容器5、启动和停止容器的操作 总结 前言 本文主要介绍docker中与容器相关的一些命令,是对狂神课程的一些总结,作为一个手册帮助博主和使用docke…...
![](https://www.ngui.cc/images/no-images.jpg)
Vue3 ElementPlus el-cascader级联选择器动态加载数据
参考了这位的大佬的写法 element el-cascader动态加载数据 (多级联动,落地实现)_el-cascader 动态加载_林邵晨的博客-CSDN博客 <el-cascader style"width: 300px" :props"address" v-model"addressValue" …...
![](https://www.ngui.cc/images/no-images.jpg)
leetcode分类刷题:栈(Stack)(一、字符串相邻元素删除类型)
1、在leetcode分类刷题:基于数组的双指针(一、基于元素移除的O(1)类型)题目中,采用双指针之快慢指针的算法来解决。 2、字符串相邻元素的删除问题,用栈来进行管理,会非常有效;这种题型排在后面的…...
![](https://img-blog.csdnimg.cn/57173fafdc1e4d3a8a646c7f4b8056c4.png)
你还在找淘宝商品信息查询的接口吗?
你还在找淘宝商品信息查询的接口吗?,不用找了,我这有,免费测试 在很多行业,比如淘客、商品采集、刊登、数据分析行业都需要用到相关的商品接口,但是官方一般又没有开放这些接口,怎么办ÿ…...
![](https://img-blog.csdnimg.cn/img_convert/fb3be7a3554266997f40b253aab5cd91.png)
dll修复精灵,dll修复工具下载方法分享,mfc140u.dll缺失损坏一键修复
今天,我将为大家分享一个关于mfc140u.dll的问题。首先,我想问一下在座的网友们,有多少人知道mfc140u.dll是什么?又有多少人知道它的作用以及如何解决这个问题呢?在接下来的演讲中,我将详细介绍mfc140u.dll的…...
![](https://www.ngui.cc/images/no-images.jpg)
[LINUX使用] iptables tcpdump
iptables: 收到来自 10.10.10.10 的数据后都丢弃 iptables -I INPUT -s 10.10.10.10 -j DROP 直接 reject 来自 10.10.10.* 网段的数据 iptables -I INPUT -s 10.10.10.0/24 -j REJECT tcpdump: dump eth0的数据到本地 tcpdump -i eth0 -w dump.pcap 只抓 目的地址是 10…...
![](https://img-blog.csdnimg.cn/fc827a3839334735b1e73bbe950ddea7.jpeg#pic_center)
百度文心一率先言向全社会开放 应用商店搜“文心一言”可直接下载
8月31日,文心一言率先向全社会全面开放。广大用户可以在应用商店下载“文心一言APP”或登陆“文心一言官网”(https://yiyan.baidu.com) 体验。同时,企业用户可以直接登录百度智能云千帆大模型平台官网,调用文心一言能…...
![](https://img-blog.csdnimg.cn/f36e992f221442539c0a1c2a21ce4777.png)
【100天精通Python】Day56:Python 数据分析_Pandas数据清洗和处理
目录 数据清洗和处理 1.处理缺失值 1.1 删除缺失值: 1.2 填充缺失值: 1.3 插值: 2 数据类型转换 2.1 数据类型转换 2.2 日期和时间的转换: 2.3 分类数据的转换: 2.4 自定义数据类型的转换: 3 数…...
![](https://img-blog.csdnimg.cn/fb5d6134c9444dd4b977c7e5c6eab1d9.gif)
【vue】使用无障碍工具条(详细)
引入:使用的是太阳湾的无障碍工具条,代码地址:https://gitee.com/tywAmblyopia/ToolsUI 具体步骤:下载代码后,将其中的 canyou 文件夹拖入 vue 项目中的 public 文件夹中; 上图是在项目目录中的样子&#…...
![](https://www.ngui.cc/images/no-images.jpg)
java实现命令模式
命令模式是一种行为设计模式,它允许您将请求封装为对象,以便您可以将其参数化、队列化、记录和撤销。在 Java 中实现命令模式涉及创建一个命令接口,具体命令类,以及一个接收者类,该接收者类执行实际操作。下面是一个简…...
![](/images/no-images.jpg)
兼职做放单主持那个网站好/谷歌推广外贸建站
因为BlackBerry PlayBook的发布,因为BlackBerry SuperPhone的消息,我开始学习QNX。我是一个传统的程序员,所熟悉的是Java, C/C等开发语言,操作系统方面所了解的也是Windows, Unix, Linux等。QNX对我来说是一个全新的世界ÿ…...
![](/images/no-images.jpg)
短网址生成防红/郑州网站优化顾问
用到的知识点: 1、定时时器的简单使用与停止 2、与oc的区别 ,可以再定义类的成员变量的时候给初始值 1 /*2 首先创建一个文件:a.java3 需求: 使用java描述一个车与修车厂两个事物, 车具备的公共属性:轮子数、 名字、 颜…...
![](https://img-blog.csdnimg.cn/img_convert/4788238c07cd1e60d3d4d3f40abd25e2.png)
wap蓝天建站/目前小说网站排名
介绍: Clipore可以自动记录你的剪贴数据,办公,经常复制文本或常忘记之前复制了些啥的推荐使用! 除了记录剪贴数据还有一些有用的功能提供使用哦! 1.当你复制文本时自动记录所复制的文本,在软件中双击记录…...
![](https://images2015.cnblogs.com/blog/948588/201612/948588-20161222115803276-1329242374.png)
郑州网站优化汉狮/快速排名官网
题目链接: http://www.51nod.com/onlineJudge/user.html#!userId21687 题意: 中文题诶~ 思路: 本题就是个中国剩余定理模板题,不过模拟也可以过,而且时间复杂度嘛~ 我们可以知道gcd得出两个数的最大公约在最坏的情况下(a, b是相邻的两个斐波拉契数)是O(logn)的, 同理可以知道ex…...
![](/images/no-images.jpg)
网站建设服务介绍/seo海外
C实现生产guid唯一号 在日常软件开发中,我们经常需要一个唯一标识来标识一个对象或编码文件,下面是C实现的方法,其中sgi_log_t.h头文件定义在log4cplus应用 -日志管理类接口文章中有说明,为了更好的记录生产的guid;#in…...
![](/images/no-images.jpg)
建设银行 企业网站/seo优化服务是什么
1.常规方法,用两个栈分别保存数字和符号 import reclass Solution:def calculator(self, expression):# 定义符号优先级prority {"": 1, "-": 1, "*": 2, "/": 2}# 使用数字栈和符号栈分别存放number_stack, operator_st…...