唤醒手腕 Go 语言 并发编程、Channel通道、Context 详细教程(更新中)

并发编程概述

​ 一个进程可以包含多个线程,这些线程运行的一定是同一个程序(进程==程序),且都由当前进程中已经存在的线程通过系统调用的方式创建出来。进程是资源分配的基本单位,线程是调度运行的基本单位,线程不可独立于进程存在。

​ 所有线程都有自己的线程栈,以此存放自己的私有数据(包含在进程的虚拟内存地址中)。一个进程中的很多资源也会被线程所共享,包括在当前进程虚拟内存地址中存放的代码段、数据段、堆、信号处理函数、文件描述符(非负整数)。正因如此,创建一个线程时不会像创建一个进程时那样耗费资源,因为其大多数资源都因共享而无需被复制。

什么是协程?

在这里插入图片描述

Go 语言线程模型

Go 语言本身是为并发而打造的语言。那它的线程模型是怎么样的呢?

传统是怎么处理是这样的,把数据放到共享内存,给多线程使用,这个方式是不是看上去非常简单,但是在并发访问的控制上就变的很复杂。

Go 语言的是这么处理的,它不推荐用共享内存的方式传递数据,它推荐使用 channel。channel主要用来在多个 Go 语句片段之前传递数据,这样做还会保证并发的安全性。不过 Go 还是保留了传统的方法(互斥量、条件变量等)。

了解 Go 的线程模型之前,我们需要知道 Go 的核心元素,它们支撑起了这个模型的主框架。

参数说明
M(machine)一个M对应一个内核线程。
P(processor)一个P代表执行一个Go代码片段必需的资源。
G(goroutine)一个G代表Go代码片段。

Go 语言 Channel 通道

在 Go 语言中管道类似于一个数据流,每次放入或者取出一部分数据,数据取出后原通道内的数据就删除掉,在linux操作系统中管道会将函数的返回结果作为下一个函数的参数

channel 产生背景

线程之间进行通信的时候,会因为资源的争夺而产生竟态问题,为了保证数据交换的正确性,必须使用互斥量给内存进行加锁,Go 语言并发的模型是 CSP,提倡通过通信共享内存,而不是通过共享内存而实现通信,通道恰巧满足这种需求。

channel 工作方式

channel 类似与一个队列,满足先进先出的规则,严格保证收发数据的顺序,每一个通道只能通过固定类型的数据。如果通道进行大型结构体、字符串的传输,可以将对应的指针传进去,尽量的节省空间

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSS---Emmet(二)

一、Emmet语法 Emmet语法是一种用于快速编写HTML和CSS的缩写技术。它允许开发者通过简洁的表达式快速生成复杂的代码结构,极大地提高了编码效率。使用Emmet,你只需要写出一些简短的缩写符号和操作符,然后通过快捷键(通常是Tab键&…

[单机]完美国际_V155_GM工具_VM虚拟机

[端游] 完美国际单机版V155一键端PC电脑网络游戏完美世界幻海凌云家园 本教程仅限学习使用,禁止商用,一切后果与本人无关,此声明具有法律效应!!!! 教程是本人亲自搭建成功的,绝对是…

定时任务的几种实现方式

定时任务实现的几种方式: 1、JDK自带 (1)Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。…

kali linux2024.1版安装

1 基于 VMware 安装 Kali 系统 打开已经安装好的 VMware 程序,点击选项卡中的“主页”--》而后点击“创建新的虚拟机” 选择“典型(推荐)”,并点击“下一步” 客户机操作系统镜像选择:选择“稍后安装操作系统”,并点击“下一步”…

网安面经之SSRF漏洞

一、ssrf漏洞 1、ssrf原理?危害?修复(防御)? 原理:SSRF就是服务器端请求伪造漏洞、它是一种由攻击者构造,由服务端发起请求的一个网络攻击,一般用来在外网探测或攻击内网服务&…

使用Flask构建POST请求的Web应用

文章目录 准备工作创建路由处理POST请求创建表单页面运行应用结论 在Web开发中,处理POST请求是一项常见任务,特别是在构建表单提交、用户注册和数据提交等功能时。Flask是一个简单而强大的Python Web框架,它提供了方便的工具来处理HTTP请求&a…

WEB前端复习——CSS

CSS:层叠样式表 将显示样式与内容分开 基本语法&#xff1a; 选择器{ 规则; } ①标签选择器&#xff1a;以HTML标签名为选择 <style>p{color: red;} </style> <body><p>你好</p> </body> ②id选择器&#xff1a;一次性的 以#号定义 &l…

美颜画面调节SDK解决方案,打造专业级美颜画质

视频与图像的质量成为了企业展示自身形象、吸引用户注意力的关键&#xff0c;为了满足企业对高质量美颜画面调节的需求&#xff0c;美摄科技精心打造了一款面向企业的美颜画面调节SDK解决方案&#xff0c;该方案不仅集成了LUT和调色滤镜等先进技术&#xff0c;更在人脸场景画面…

luceda ipkiss教程 70:合并GDS版图

通过代码拼版&#xff1a; 所有代码如下&#xff1a; from si_fab import all as pdk from ipkiss3 import all as i3class Design1(i3.GDSCell):def _default_filename(self):return "Ring_Test.gds"def _default_name(self):return "Design1"class Des…

出现Duplicate key

解决&#xff1a; 第一种情况&#xff1a; 添加一个字段prjId &#xff0c;和数据库表映射时&#xff0c;映射的字段存在映射关系了。 将第二个 TableField中的prj_num改成prj_id 即可。 第二种情况&#xff1a; 转成map的形式时&#xff1a;key重复了&#xff0c;不知道把值赋…

计算机视觉——基于改进UNet图像增强算法实现

1. 引言 在低光照条件下进行成像非常具有挑战性&#xff0c;因为光子计数低且存在噪声。高ISO可以用来增加亮度&#xff0c;但它也会放大噪声。后处理&#xff0c;如缩放或直方图拉伸可以应用&#xff0c;但这并不能解决由于光子计数低导致的低信噪比&#xff08;SNR&#xff…

Swift 字符串和字符

字符串和字符 一、字符串字面量1、多行字符串字面量2、字符串字面量的特殊字符3、扩展字符串分隔符 二、初始化空字符串三、字符串可变性四、字符串是值类型五、使用字符六、连接字符串和字符七、字符串插值八、Unicode1、Unicode 标量2、可扩展的字形群集 九、计算字符数量十、…

搭建nacos集群

1.修改nacos/conf/application.properties 2.在数据库中执行nacos/conf/nacos-mysql.sql脚本 3.修改nacos/conf/cluster.conf文件 4.修改startup.sh文件模式为集群 5.启动服务 附&#xff1a;安装nginx 修改/usr/local/openresty/nginx/conf/nginx.confi文件 http{}中增加如下…

关于一致性,你该知道的事儿(上)

关于一致性&#xff0c;你该知道的事儿&#xff08;上&#xff09; 前言一、缓存一致性二、内存模型一致性三、事务一致性四、分布式事务一致性4.1 分布式系统的一些挑战4.2 关于副本的一些概念4.3 分布式事务之共识问题4. 3.1 PC(two-phase commit, 2PC)4.3.2 Raft 三、后记参…

地理加权回归模型——一种局部的空间回归分析方法

地理加权回归&#xff08;GWR&#xff09;是一种局部的空间回归分析方法&#xff0c;它允许模型参数在空间上变化&#xff0c;从而能够捕捉到空间数据的局部空间非平稳性。GWR模型的基本思想是在回归分析中引入空间权重&#xff0c;使得模型能够根据地理位置的邻近程度对观测值…

手写Windows文件路径获取小工具

手写Windows文件路径获取小工具 目的 给Windows右键增加功能&#xff0c;右键任何文件&#xff08;夹&#xff09;显示复制文件路径的扩展。 效果展示 实现思路 右键调用&#xff0c;自身会把文件路径传递给被调用文件&#xff0c;被调用文件内只需将路径参数复制到剪贴板即…

Qt---窗口系统

一、QMainWindow QMainWindow是一个为用户提供主窗口程序的类&#xff0c;包含一个菜单栏&#xff08;menu bar&#xff09;、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget) 1. 菜单栏(最多有一个) QMenuBar *bar…

Chromium编译指南2024 Windows11篇-编译前的准备工作和Visual Studio安装(一)

前言 在这个数字化快速发展的时代&#xff0c;浏览器不仅是我们获取信息的窗口&#xff0c;更是开发者表达创意和技术实力的舞台。 Chromium是由Google于2008年发起的开源浏览器项目&#xff0c;致力于为用户提供更快、更安全、更稳定的网页浏览体验。 其作为开源浏览器项目…

团结引擎+OpenHarmony 3 通信

团结引擎和鸿蒙之间通信 因为 ts 并没有像 JAVA 有反射的调用&#xff0c;所以我们必须要像 Web GL 平台一样通过导出的行为告诉引擎到底哪些 ts 的接口可以给 C# 来调用。 1 在 Tuanjie 引擎里 需要一个tsllib文件&#xff0c;用于设置给导出对象 C#使用。就可以直接创建以 …