go语音进阶 多任务

多任务

什么叫多任务?简单说:就像是操作系统可以同时执行 多个任务。打个比方 你一边使用 浏览器上网,一遍在听MP3, 一边再用 word 赶作业。对于电脑来讲这就是多任务,还有很多任务悄悄的在后台同时运行着,只是桌面上没有显示

什么是并发:

Go是并发语言,而不是并行语言。在讨论如何在 Go中进行并发处理之前。我们首先必须了解什么是并发。以及它 与 并行有什么不同。

并发性 Concurrency 是同时处理许多事情的能力。

例如:一个人在晨跑,在晨跑时 他的鞋带松了 现在这个人停止跑步, 系鞋带 然后再继续跑步。同一时间点只能做一个任务,你不能边跑步变 边系鞋带,这就是一个并发性的例子。这个人是能够同时处理跑步和 系鞋带。这是一个人 能够同时处理很多事情。但是同一时刻只能做一件

什么是 并行性 parallelise ,它与 并发性 concurrency 有什么不同?

  • 并行性就是同时做很多事情,这听起来感觉和 并发类似,但是还是有区别的。让我们继续以 慢跑的例子理解她, 在这种情况下:我们假设这个人再慢跑 并且再使用它的手机在听音乐,在这种情况下:一个人边跑步 边听音乐 那就是它同时在做很多事情 同时进行。同一个时刻点 可以做多件事情。 这就是所谓的并行性。(parallelism)

并发性 和 并行性 一种技术上的观点

假设我们正在编写 一个web 浏览器。 web浏览器有各种组件。其中两个是 web 页面呈现区域 和 下载文件 从 internet 下载的下载器。假设我们以这种方式构建了 浏览器代码。这样每个组件都可以 独立的执行。当这个浏览器运行在 单核心的处理器上面的时候,处理器将在浏览器的两个组件 之间进行上下文切换。它可能会下载一个文件一段时间,然后它可能会切换到呈现用户请求的网页 html. 这就是所谓的 并发性。 并发从不同的时间开始,他们执行周期重叠,在这种情况下 下载和呈现从不同时间点开始。他们执行重叠。

假设同一浏览器在多核心的处理器上运行,这种情况下,文件下载 和 html 呈现组件在不同的核心中运行 这就是所谓的 并行性

  • 并发性:利用 cpu 时间片 接替执行 看起来像是同时执行,实际上同一时刻只能做一件事情,就像 上面 边跑步 -> 系鞋带 -> 跑步
  • 并行性:利用 多核CPU 同一时刻 同时干多件事情, 上面跑步 和 听音乐 同时进行

并行性 Parallelise 不会总是会更快(按照业务选择)。因为并行运行的组件如果通常需要相互通信,就需要等待等等的 操作也会使 并行的效率降低。

串行 并行 并发

时间片:

  • 串行:依次执行
  • 并行: 多核心同时执行 同一时间点 可以有多个
  • 并发:轮流 切换执行, 同一时间点 就有一个在执行

进程 线程 协程

进程(process) 线程(Thread) 协程(Coroutine, 也叫轻量级线程)

进程:

进程是一个独立在一个数据集中的一次动态执行过程,可以简单理解为 "正在执行的程序"。 他是CPU资源分配和调度的独立单位。进程一般由程序,数据集,进程控制块三部分组成。我们编写的程序用来描述 进程要完成那些功能 以及如何完成;数据集则是程序在执行过程中需要使用的资源; 进程控制块用来记录程序外部特征。描述进程的执行变化过程。系统可以利用他来控制和管理进程,他是系统感知进程的唯一标志。 进程的局限是创建 撤销 和 切换 的 开销很大

线程:

线程实在进程之后被发展出来的的概念。线程也叫轻量级进程。 他是一个基本的 cpu 执行单元。也是程序执行中的最小单元, 线程由 线程ID 程序计数器, 集成器集合 和 堆栈共同组成。一个进程可以包含多个线程,一般会有一个主线程。 线程的有点是见笑了程序并发执行时的开销,提高了操作系统的并发性能。缺点是 线程没有自己系统的资源,只拥有在运行时必不可少的资源。 但同一个进程的各种线程 可以共享进程的所有系统资源,如果把进程比作一个车间,那么线程就好比是车间的 工人,不过对于某些独占性的资源存在锁的机制,处理不当可能会死锁。

协程:

协程是一种用户态的轻量级线程,又称为 微线程 英文名称Coroutine, 协程的调度完全是由用户控制。人们常常将协程和子线程 对比

  • 子线程调度是一个入口一次返回 一旦退出即完成了子线程的执行
  • 于传统的系统线程和进程相比,协程的最大优势在于其 "轻量级"。 可以轻松创建上百万个而不会导致系统资源衰竭。而线程和进程通常最多不能超过 1万的,这也是协程被称为轻量级线程的原因。
协程于多线程相比优势在于:

协程执行效率高,因为子程序切换不是线程切换,而是由本身程序控制,因此没有线程切换的开销 和 多线程比 线程数量越多 协程的性能优势越明显。

Go语言的并发是靠 协程 实现的 即: Goroutine

相关推荐
Joker-01111 小时前
深入 Go 底层原理(五):内存分配机制
golang·mcache·mcentral·mheap
鹿野素材屋2 小时前
C#中对于List的多种排序方式
开发语言·c#
whxnchy2 小时前
C++刷题 - 7.27
开发语言·c++
一只叫煤球的猫2 小时前
被架构师怼了三次,小明终于懂了接口幂等设计
后端·spring·性能优化
白日梦想家-K3 小时前
题单【模拟与高精度】
开发语言·c++·算法
鹦鹉0073 小时前
IO流中的字节流
java·开发语言·后端
重生之我是Java开发战士3 小时前
【C语言】内存函数与数据在内存中的存储
c语言·开发语言·算法
haaaaaaarry3 小时前
Element Plus常见基础组件(二)
开发语言·前端·javascript
AI_RSER3 小时前
第一篇:【Python-geemap教程(三)上】3D地形渲染与Landsat NDVI计算
开发语言·python·3d·信息可视化·遥感·gee
apocelipes4 小时前
atomic不是免费午餐
java·性能优化·golang·并发