非零基础自学Golang 第13章 并发与通道 13.1 概述

news2025/1/25 9:09:23

非零基础自学Golang

文章目录

      • 非零基础自学Golang
      • 第13章 并发与通道
        • 13.1 概述
          • 13.1.1 并行与并发
          • 13.1.2 Go并发优势

第13章 并发与通道

并发是指在同一段时间内,程序可以执行多个任务。

随着社会需求的发展,光靠硬件的提升是无法满足高并发的需求的,因此从程序的角度去解决并发问题就显得尤为重要。

最早支持并发编程的语言是汇编语言,但那时没有任何理论来支持这种编程模式,因此一个细微的编程错误就可能导致程序变得非常不稳定。

到现在为止,基本所有的语言都支持并发编程,而Go语言最大的特点就是从语言层面支持并发。

下面会详细讲解Go语言如何利用协程(coroutine)和通道(channel)来解决并发问题。

13.1 概述

在程序中往往有很多很耗时的工作,比如上传文件、下载文件、网络聊天。这时候,一个线程是服务不了多个用户的,会产生因为资源独占导致的等待问题,这时候就需要使用并发的手段来解决。

并发编程的含义比较广泛,包括多线程编程、多进程编程以及分布式程序。

本章所讲述的并发叫作协程(coroutine),属于多线程编程。

在计算机刚出现的那个年代并没有“并发”这个概念,因为以前的命令式程序是以串行为基础,程序会依次执行每一条指令,整个程序只有一个上下文和一个调用栈。

并发则意味着程序可以有多个上下文、多个调用栈。

【提示】

调用栈是计算机科学中存储有关正在运行的子程序的消息的栈,经常被用于存放子程序的返回地址。

在调用任何子程序时,主程序都必须暂存子程序运行完毕后应该返回到的地址。因此,如果被调用的子程序还要调用其他的子程序,其自身的返回地址就必须存入调用栈,在其自身运行完毕后再取回。

13.1.1 并行与并发

很多时候我们会把“并行”和“并发”理解成同一个概念,但实际上,它们有着清晰的区别。

我们先来看它们的定义。

  • 并行(parallelism):指在同一时刻,有多条指令在多个处理器上同时执行。
  • 并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速地轮换执行,得到在宏观上有多个进程同时执行的效果,但在微观上并不是同时执行,只是把时间片分成了若干段,使得多个进程快速交替执行。

并行是真正意义上的同时执行,而并发只是从宏观的角度来看具有同时执行的效果。

如下左图所示,

在这里插入图片描述

对于任务A和B,在任何时刻,任务A、B都在执行,这就是并行。如上右图所示为并发,在任何时刻,有且仅有一个任务在执行,但由于计算机处理速度非常快,对于任务A和B,从宏观的角度来看就感觉它们是在同时执行。

13.1.2 Go并发优势

Go语言的优势在于从语言层面上支持了并发,并发编程的内存管理有时是非常复杂的,而开发者不用担心并发的底层逻辑、内存管理,因为这些在语言层面上已经解决了,开发者只需要编写好自己的业务逻辑即可。

Go语言也提供了十分强大的自动垃圾回收机制,开发者不用担心创建的量如何销毁。【牛逼!】

在Go语言里,想要编写一个并发程序是非常容易的事,它不需要额外引用其他的第三方库,只需要使用“go”关键字就可以实现。

在其他语言中,编写并发程序往往需要使用其他的并发库才能实现。【Java 高并发可是一门… 】

在Go语言里,只需要使用“go”加上函数名称就可以让这个函数变为并发函数,如下所示:

[ 动手写 13.1.1]

package main

func run(arg string) {
   // 此线程的任务
}

func main() {

   go run("this is new thread")
}

Go语言的并发基于CSP(Communication Sequential Process,通信顺序进程)模型,CSP模型是在20世纪70年代提出的用于描述两个独立的并发实体通过共享的通信管道(channel)进行通信的并发模型。

CSP中channel是一类对象,它不关注发送消息的实体,而关注发送消息时使用的通信管道。

简单来说,CSP模型提倡通过通信来共享内存,而非通过共享内存来通信。

基于CSP模型,也就意味着显式锁都是可以避免的,比如资源竞争——多个进程同时获取文件资源并需要进行修改时,首先拿到资源的进程会加上锁,等修改完之后再把锁去掉,然后提供给下一个进程来进行修改,只有这样才不会出现数据不一致。

但是Go语言不是通过锁的方式,而是通过通信的方式,通过安全的通道发送和接收数据以实现同步,这就大大简化了并发编程的编写。【厉害】

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

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

相关文章

[前端攻坚]:数组去重的几种方法

总结一些日常需要用到的一些api,也是在一些面试中会经常出现的题目,今天分享的是数组去重的几个不同的方法, 同时文章也被收录到我的《JS基础》专栏中,欢迎大家点击收藏加关注。 数组去重的方法 1.set去重 2.map去重 3.for循环in…

Python安装Pycrypto

前言 安装 使用以下命令安装 pip install pycrypto2.6.1报错 如果在安装过程中出现如下错误 则说明系统缺乏相应python开发包,需要进行安装对应的python开发包 解决 在CentOS下,如果是python2.7则使用如下命令安装 yum install python-devel是pyt…

Pytest用例运行及规范

温馨提示 本篇约1600字,看完需3-5分钟,学习学半小时,加油! 先看普通函数运行顺序 import pytestdef test_one():print("我是清安")def test_02():print("--02--")def test_a():print("--a--")de…

BP神经网络的最简Python实现

文章目录神经元BP原理及实现测试BP,就是后向传播(back propagation),说明BP网络要向后传递一个什么东西,这个东西就是误差。 而神经网络,就是由神经元组成的网络,所以在考虑BP之前,还不得不弄清楚神经元是…

endata 电影票房响应数据破解

本文仅供参考学习,如有侵权可联系本人 目标网站 aHR0cHM6Ly93d3cuZW5kYXRhLmNvbS5jbi9Cb3hPZmZpY2UvQk8vWWVhci9pbmRleC5odG1s加密入口分析 在异步请求那里可以看到请求接口,请求参数并未加密只是响应内容进行了加密,暂时也无法判断加密方…

JavaWeb的Servlet学习之Request03

目录 1.Request 1.1Request执行流程 1.2request对象和response对象的原理 1.3 request对象继承体系结构 1.4request功能: 1.3.1获取请求消息数据 1.获取请求行数据 2.获取请求头 3.获取请求体数据 4.其他功能 4.1获取请求参数通用方式:不论get…

开源CA搭建-基于openssl实现数字证书的生成与分发

目录 一、前言 二、openssl介绍 三、openssl的常用用法 (一)单向加密 (二)生成随机数 (三)生成公钥,私钥 1.生成私钥 2.提取公钥 四、搭建CA (一)创建根CA私钥…

Linux的camera驱动 摄像头调试方法

CameraInfo类用来描述相机信息,通过Camera类中getCameraInfo(int cameraId, CameraInfo cameraInfo)方法获得, 主要包括以下两个成员变量facing,facing 代表相机的方向, 它的值只能是CAMERA_FACING_BACK(后置摄像头&am…

Golang 【basic_leaming】1 基本语法

阅读目录Go 语言变量Go 语言 - 声明变量1. 标准格式2. 批量格式Go 语言 - 初始化与定义变量1. 标准格式2. 编译器推导类型格式3. 短变量声明与初始化Go语言 - 多变量同时赋值Go 语言 - 匿名变量参考资料Go 语言整型(整数类型)1 自动匹配平台的 int 和 un…

新项目为什么决定用 JDK 17了

大家好,我是风筝。公众号「古时的风筝」,专注于后端技术,尤其是 Java 及周边生态。文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面。 最近在调研 JDK 17,并且试着将之前…

阴差阳错,阴阳之变

北京的第一批“杨康”们已经返回到工作岗位,这其中就包括我。简单总结一下我的感染和康复过程,给大家做个样本吧。我属于北京放开的第一波感染者,12.9日当天感觉嗓子干,毫不犹豫,果然是中招了;周末开始发烧…

特朗普发行NFT惹群嘲,上线售罄现“真香定律”

文/章鱼哥出品/陀螺财经特朗普14日在其创建的社交平台truth social上发帖称,“美国需要一个超级英雄”。他还预告自己将于当地时间15日宣布“重大消息”。据《新闻周刊》报道,特朗普当日在其社交平台上发了一段十几秒的视频,里面有一个他站在…

Windows实时运动控制软核(三):LOCAL高速接口测试之C++

今天,正运动小助手给大家分享一下MotionRT7的安装和使用,以及使用C对MotionRT7开发的前期准备。 01 MotionRT7简介 MotionRT7是深圳市正运动技术推出的跨平台运动控制实时内核,也是国内首家完全自主自研,自主可控的Windows运动控…

Linux搭建测试环境详细步骤

本文讲解如何在Linux CentOS下部署Java Web项目的步骤 环境准备 (1)Linux系统(2)JDK(3)Tomcat (4)MySQL工具下载 一、Linux系统 本文主要是Linux CentOS7为例 自己在家练习小项…

[拆轮子] PaddleDetection 中的 COCODataSet 是怎么写的

今日,辗转反侧,该💩的代码就是跑不成功,来看看 COCODataSet 到底是怎么写的,本文只参考当前版本的代码,当前版本 PaddleDetection2.5 COCODataSet 源码见附录 COCODataSet 类内部就三个函数: …

词义和词义消歧

Synsets(“synonym sets”, effectively senses) are the basic unit of organization in WordNet.同义词集 对于许多应用程序,我们希望消除歧义 • 我们可能只对一种含义感兴趣 • 在网络上搜索chemical plant 化工厂,我们不想搜到香蕉中的化学物质 所以…

【SpringBoot扩展点】 容器刷新前回调ApplicationContextInitializer

本文将作为Spring系列教程中源码版块的第一篇,整个源码系列将分为两部分进行介绍;单纯的源码解析,大概率是个吃力没人看的事情,因此我们将结合源码解析,一个是学习下别人的优秀设计,一个是站在源码的角度看…

【MySQL】索引和事务重点知识汇总

目录1.索引:1.1 索引的使用:1.2 索引背后的核心数据结构:1.2.1 先认识 B 树(N叉搜索树):1.2.2 再认识 B 树(N叉搜索树):2.事务:2.1 隔离性:2.1.1 脏读问题:2.1.2 不可重复读问题:2.1.3 幻读问题:2.1.4 总结:2.1.5 隔离级别:1.索引: 索引存在的意义就是为了提高查询到效率.索引…

【AI理论学习】Python机器学习中的特征选择

Python机器学习中的特征选择特征选择方法特征选择的Python库使用Scikit-learn实现特征选择方差卡方检验ANOVALasso正则化递归特征消除使用Feature-engine进行特征选择单变量特征选择相关性Python 中的更多特性选择方法参考资料任何数据科学项目的一个重要步骤是选择最具预测性的…

vue实现文件下载

引言 最近在自己做项目的需求的过程中,需要vuespringboot实现文件的下载功能(导出博客文件)。 问题重现 在我后端文件下载接口开发完成后,使用vue前端去进行对接时出现了问题。 我是直接使用的axios去进行请求接口&#xff0c…