Go并发快速入门:Goroutine

Go并发:Goroutine

1.并发基础概念:进程、线程、协程

(1) 进程

可以比作食材加工的一系列动作

进程就是程序在操作系统中的一次执行过程,是由系统进行资源分配和调度的基本单位,进程是一个动态概念,是程序在执行过程中分配和管理资源的基本单位,每一个进程都有一个自己的地址空间。一个进程至少有5种基本状态:初始态、执行态、等待状态、就绪状态、终止状态。

通俗讲: 进程就是一个正在执行的程序。

[一般情况] 一个程序一个进程

[多进程]] 一个程序多个进程

可以在终端输入以下内容,来列出所有的进程

ps -A

比如在Windows系统中,一个运行的xx.exe就是一个进程。

在这里插入图片描述

(2) 线程

可以比作食材加工的某一个动作

线程是运算调度的最小单元,是进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。

进程与线程的区别如下

根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位

资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的

影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行

查看线程

  1. 进入 terminal
  2. 输入命令 ps-M[pid]
  3. 查看对应 pid 线程
(3) 协程

协程(goroutine) 是轻量级的执行线程。

在这里插入图片描述
在这里插入图片描述

实操

假设我们有一个函数叫做 action()。 我们一般会这样 同步地 调用它使用 go action() 在一个协程中调用这个函数。 这个新的 Go 协程将会 并发地 执行这个函数。

package main import ("fmt"// "time"
)func action() {fmt.Println("Test Goroutine")
}func main() {go action()// time.Sleep(2 * time.Second)
}

在这里插入图片描述

可见咩有任何输出,把注释内容取消注释再运行

在这里插入图片描述

为什么要沉睡?

go 语言运行非常快,若没有沉睡,可能会导致

“协程还没有执行完, main 函数已经结束了”

最终导致协程结束前, main 函数已经被销毁

因此我们需要让主进程去等待一定时间的子协程,才能得到子协程的输出

2.多协程核心机理

在这里插入图片描述

步骤

  • 任务切片/分配
  • 启动多个协程
  • 合并多个协程结果

在这里插入图片描述

使用场景

  • 运算量比较多
  • 协程间依赖性比较弱

3.多协程等待实操

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以使用通道来同步协程之间的执行状态。使用 wait group 等待多个协程完成

package mainimport ("fmt""sync"
)func main() {var wg sync.WaitGroupfor i := 0; i < 2; i ++ {wg.Add(1)go func(num int) {fmt.Printf("Goroutine Test %d\n", num)wg.Done()}(i)}wg.Wait()
}

在这里插入图片描述

更多细节清查阅 waitgroup

Go by Example 中文版: WaitGroup (gobyexample-cn.github.io)

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

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

相关文章

结构体成员 分数比较大小

题目&#xff1a; 代码&#xff1a; #include <bits/stdc.h> #include<cstring>using namespace std;struct Num{double fenzi;double fenmu;char fenhao;};bool cmp(Num r1,Num r2){return r1.fenzi/r1.fenmu<r2.fenzi/r2.fenmu;}int main(){int n;Num num[n…

日期类的实现|运算符重载的复用

前言 通过前面C入门与类与对象的学习&#xff0c;今天我们将运用所学的知识点完成一个Date类。 本节目标 运用所学知识完成Date类。详细讲解运算符各种重载。理解运算符重载的复用。 一、Date类的六个默认成员函数 六个成员函数&#xff0c;Date类只需要自己实现构造函数即可…

文件管理小技巧:如何高效整理多种格式的图片,图片分类的方法

随着数字时代的到来&#xff0c;每天都会处理到大量的图片&#xff0c;从个人照片到工作相关的图像资料。如何高效地整理多种格式的图片&#xff0c;常常让人感到困扰。下面看下云炫文件管理器如何对图片分类的方法。 jpg图片、png图片、tiff图片未归类前的缩略图。 jpg图片、…

VUE---计算属性computed

概念&#xff1a; 基于 现有的数据 &#xff0c;计算出来的 新属性 。 依赖 的数据变化&#xff0c; 自动 重新计算 。 语法&#xff1a; ① 声明在 computed 中&#xff0c;一个计算属性对应一个函数 ② 使用起来和普通属性一样使用 {{ 计算属性名 }}&#xff0c;注意不…

shell中的正则表达式、编程-grep、编程-SED、以及编程-AWK

正则表达式RE 用来处理文本 正则表达式(Regular Expression, RE)是一种字符模式, 用于在查找过程中匹配指定的字符. 在大多数程序里, 正则表达式都被置于两个正斜杠之间; 例如/l[oO]ve/就是由正斜杠界定的正则表达式, 它将匹配被查找的行中任何位置出现的相同模式. 在正则表达…

14、MySQL高频面试题

1、内连接和外连接的区别 内连接和外连接都是数据库进行多表联查时使用的连接方式&#xff0c;区别在于二者获取的数据集不同 内连接指的是使用左表中的每一条数据分别去连接右表中的每一条数据&#xff0c;仅仅显示出匹配成功的那部分 外连接有分为左外连接和右外连接 左外…

RT-Thread入门笔记5-线程的时间片轮询调度

优先级和时间片是线程的两个重要参数&#xff0c;优先级描述了线程竞争处理器资源的能力。 优先级和时间片 优先级 RT-Thread 最大支持 256 个优先级&#xff08;数值越小的优先级越高&#xff0c;0 为最高优先级, 最低优先级预留给空闲线程&#xff09;&#xff1b;用户可以通…

Java浮点数精度问题与BigDecimal详解

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;咱们在日常的Java编程中&#xff0c;经常会遇到处理金融数据的情况&#xff0c;比如计算商品的价格或者处理用户的账户余额。在这些场景下&#xff0c;精确的数值计算就显得尤为重要。这时候&#xff0c;BigDeci…

实战使用工具appuploader上线发布苹果商店

实战使用工具appuploader上线发布苹果商店 我们发布ios应用的时候&#xff0c;步骤繁琐&#xff0c;非常耗时&#xff0c;appuploader工具就是解决一站式从上传到发布到appstore应用商店的&#xff0c;当我们开发完app后&#xff0c;需要将ipa/apk提交给测试人员测试&#xff0…

OpenGl L6坐标系统

一.标准化设备坐标 我们在L5谈到了对顶点着色器中的点进行变换&#xff0c;而变换的范围必须在 -1.0到1.0 之间&#xff0c;否者将不可见。只有将所有的点转换为标准化设备坐标后&#xff0c;才能全部传入光栅器&#xff0c;再转换为屏幕上的像素。 将坐标变换为标准化设备坐标…

【DB2】installSAM执行后会重启这件事

碎碎念 在使用自动化工具安装TSAMP的过程中&#xff0c;机器会自动重启这件事。 TSAMP真的挺折磨的&#xff0c;一个月居然因为这件事情debug两次了。 在测试自动化脚本的时候&#xff0c;第一遍安装都是好好的&#xff0c;从第二遍开始&#xff08;因为要测试脚本的幂等性&…

el-tree定义左边箭头,包括下级出现连线

效果图&#xff1a; 代码&#xff1a; <template><div class"agency-wrap"><el-treeclass"filter-tree":data"detailList":props"defaultProps"default-expand-allnode-click"onClickNode":filter-node-me…