首页 > 其他分享 >关于Go的并发

关于Go的并发

时间:2024-09-23 09:21:10浏览次数:8  
标签:src 协程 并发 线程 关于 Go CPU

前面我们提到因为Go语言的高并发、高性能,所以选择Go,这次我们看看Go的高并发。

并发编程

关于并发和并行

  • 并发:早期计算机的 CPU 都是单核的,一个 CPU 在同一时间只能执行一个进程/线程,当系统中有多个进程/线程等待执行时,CPU 只能执行完一个再执行下一个。简单来讲,并发就是多线程程序在一个核的CPU上的运行
  • 并行:并行是针对多核CPU提出的,多核CPU真正实现了“同时执行多个任务”。并行即多线程程序在多个核的CPU上的运行

多线线程在单核cpu上的运行:
在这里插入图片描述

多线线程在多核cpu上的运行:
在这里插入图片描述

Go就可以发挥多核优势,最大限度调用计算机资源

关于协程-Goroutine

  • 线程:内核态,线程跑多个协程,栈MB级别
  • 协程:用户态,轻量级线程,栈KB级别

快速打印hello goroutine:0~hello goroutine:4,就要快速开启多个协程

func HelloGoRoutine() {
   for i := 0; i < 5; i++ {
      go func(j int) {
         hello(j)
      }(i)
   }
   time.Sleep(time.Second)
}

如上代码,Go语言要开启协程,在调用函数时,在函数前加上go关键字

CPS模型

通过通信共享内存
通过共享内存实现通信

如上两张图,第一种是通过通信共享内存,第二种是我们熟悉的通过共享内存来实现通信;Go语言提倡通过通信共享内存,于是,GO语言采用了CPS模式

其中,Channel通道是我们必须了解的

Channel操作:make(chan 元素类型,[缓冲大小])

根据缓冲通道的大小,通道又可以分为:

  • 无缓冲通道:发送与接收同步,也被称为同步通道。
  • 例如: make(chan int)
  • 有缓冲通道:通道会阻塞发送。
  • 例如:make(chan int,2)

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

  • 缓冲通道就像是货架,是为了照顾消费者速度
  • 使用带缓冲的队列,不影响生产者执行效率

举一个例子:

func CalSquare() {
   src := make(chan int)
   dest := make(chan int, 3)
   go func() {
      defer close(src)
      for i := 0; i < 10; i++ {
         src <- i
      }
   }()
   go func() {
      defer close(dest)
      for i := range src {
         dest <- i * i
      }
   }()
   for i := range dest {
      //复杂操作
      println(i)
   }
}

src和dest两个channel输出0-9平方,保证了输出的顺序性,即并发安全。

参考

  • c语言中文网

标签:src,协程,并发,线程,关于,Go,CPU
From: https://blog.csdn.net/qq_73564181/article/details/142306812

相关文章

  • 关于bldc的学习笔记(三)无刷测速原理
    第一步:可以看出当只有一对级时,旋转一圈霍尔输出一个完整脉冲(一N一S)第二步:计算其中高电平的持续时间,即:t=C/Ft (其中Ft是计数频率,C为计数次数第三步:所以旋转一圈,需要的总时间为T=2*C/Ft所得出的结果就为:s/圈,倒数就为:圈/s,转化为RPM即:Ft/(2*C)*60即可值得注意的是,......
  • Django 路由层 —— 基础用法,以及底层如何实现的
    路由层负责网页URL与函数/类的对应关系用法基本用法urls.py:urlpatterns=[#基本用法path('login/',views.login),#动态输入参数path('info/<int:v1>',views.info),#可以同时传多个参数,path:v3会记录v1-v2/后面的所有路径......
  • 关于​​Vue学习笔记6中纯JavaScript实现的改进优化2
    0前言在 关于Vue学习笔记6中纯JavaScript实现的改进优化1_PurpleEndurer@5lcto的技术博客_51CTO博客 中,我们提到了一个进一步优化的方向,把表示水果的选项信息存在一个数组里,通过JavaScript输出<li>元素描述代码给用户进行选择。现在我们就来实现这种改进。1提取信息来定义数组......
  • [Mysql]基础入门篇_关于数据库的简介_初识DQL语句
    @[TOC]文章目录何为数据库数据库类型数据库管理系统(本博主使用的是Mysql数据库)何为SQL准备工作及select查询操作的简单使用何为数据库数据库是一个有组织的数据集合,允许高效存储、管理和检索信息。它通过结构化的方式存储数据,通常使用数据库管理系统(DBMS)来执行操作,如......
  • 关于 最短路 及其 拓展算法 的粗浅总结
    关于最短路及其拓展算法的粗浅总结最短路(Dijkstra)Core_Codeinlinevoiddijkstra(){memset(vis,0,sizeofvis); memset(dis,0x3f,sizeofdis);dis[s]=0;priority_queue<pair<int,int>>q;q.push(make_pair(dis[s],s));while(!q.empty()){......
  • 关于订单信息的Excel数据分析报告
    提升自己,掌握数据分析的能力,最快的方式就是实践! 这里又是一个Excel数据分析项目的分析报告,有需要项目配套数据集的可以关注私信我免费获取(●'◡'●)     ......
  • golang 项目引入私有仓库包
    场景:当你多个项目,都需要使用一个或者多个方法,那么可以将公共方法,抽成一个包,进行管理(类似Log模块等)。这时候可以将你的包上传到私有的仓库,其他项目引入该包即可。下面来介绍下,如何引用私有仓库的包。1. 创建一个新的Git标签假设你已经在你的私有GitLab仓库目录中,并且你已经......
  • 关于​​Vue学习笔记6中纯JavaScript实现的改进优化1
    0前言在 Vue学习笔记6:分别使用纯JavaScript和Vue的v-if指令来有条件地渲染网页元素_PurpleEndurer@5lcto的技术博客_51CTO博客的纯JavaScript实现有条件地渲染网页元素中,我们列举了苹果、桔子和葡萄3种水果,并使用3个<p>...</p>来对应,在实现显示用户选择的水果的showFruit函数中,......
  • 基于django+vue基于B_S的驾校在线学习考试系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和互联网的普及,传统教育模式正经历着深刻的变革。驾校培训作为机动车驾驶员获取驾驶资格的重要环节,其教学模式亦需......
  • 基于django+vue基于b_s的婚恋平台管理系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,人们的社交方式发生了深刻变革,线上婚恋交友平台作为新兴社交形式,逐渐成为现代人寻找伴侣的重要途径。然而,面对日......