1.我们经常在编程中听到两个概念,或者在生活中也听到过两个概念。并发和并行。
并发和并行有什么不同呢?很多人对这两个概念难以区分。
并是一起的意思,并发一起发生,并行一起进行。如果按照中文去理解好像是一回事
我们可以从英文的角度来看一下
paerllel 并行
这个有平行线的意思,并行
concurrency并发
这个单词需要记住,很多英文文章中都会出现这个单词。con共同、一起
一起发生了
一个是平行线的意思,一个是一起发生的意思。我们该怎么体会这个事情呢?
并行有并排一起进行的意思,如果以高速公路为例子,高速的车都是无干扰的,进行。
并行指的是,同时在某一时刻有好几件事同时在做。他们各自互不干扰
同一时刻,互不干扰的在做事这个就是并行的概念
concurrency并发,它指的是一起就发生了,它是什么意思呢?
在指定的时间段内,有一些事在发生。
并发是一段时间内要处理的事情
比如高速公路口,有两万辆车一起等待进入高速,在0点时刻。在一段时间内,这两万俩车,要通过路口进入高速公路,这个事就是并发
某以时刻有4个车同时进入高速路口。
并行同一时刻好几件事,互不干扰的在进行
2.并发的解决方案
为什么我们在生活中,更多的是听到的并发或者高并发?我们该如何解决,并发或者 高并发的问题?
食堂打饭模型:
假设在学校中学生去食堂吃饭,12点到1点这是午饭的时间。 这就是一段时间内有
很多人想吃完饭。
思考问题的时候,要从最简单的模型开始。
学校是一个孤岛,有一个唯一的食堂、开门时间仅仅在12点到1点这个时间段供应午餐,其余时间都不会供应食物。并且食堂只有一个窗口打饭。想吃饭的话,只能进行排队,有5000人排队。
其实遇到高并发的时候,大家第一个想到的问题是什么呢?
排队,什么意思呢?排队是天然解决高并发的方案之一,排队就是队列。
5000排队进行一一打饭,FIFO先进先出
3.缓冲区:
对数据进行排队,先到先得。排队的这个区间称为缓冲区,我们用Queue先进先出模块和LifoQueue后进先出队列,和PriorityQueue小顶堆实现。
缓存什么时候使用呢?
需要大量计算、耗时很长。反复要计算,在一段时间内,输入一定输出一定
4.争抢
遇到高并发可以用先进先出队列进行解决,还有什么解决方法,争抢。每个人都争抢进行打饭。你认为争抢是一个比较好的解决方案吗?
并发不仅仅能靠排队解决,其实在计算机当中争抢的东西非常多,计算机资源是有限,争抢也是一种天然的解决方案。
虽然在排队,但是我们感觉效率总是很慢,争抢在计算机领域是一个比较不错的方案。争抢的时候,就是说刚有缝隙的时候,就有进程会立即有争抢这个资源。
能够充分利用这个资源。
使用资源的时候,进程会锁定这个资源,为了独占资源。为了保证进程在使用资源的时候不被打扰,我们需要把资源锁起来。
共享锁,你读一下,我读一下都是可以的,写入只能由一个人写入。
独占锁,我占用了资源,你们读都不能进行读取。
争抢的时候会引入锁机制,用来保证,进程在使用资源的时候,不被打扰
争抢这种方式有什么不好的地方吗?
如果资源充分,同优先级的进程,进行争抢是没关系的。
但是争抢的问题在于,如果存在紧急程度高的进程出现,会不能及时处理。
还有一些任务,很久都得不到处理。
如果你是用户,在进入一个网站的时候,很久都得不到处理。肯定用户就不等了
争抢和排队都是属于解决高并发的方案
5.预处理
因为资源有限,我们不可能把所有人的需求都加载到内存中。除非需求太少了。
我们只能把大多数人需要的东西提前准备好,这就是预处理的思想。
我们做一些统计和分析,做好80%的热们,20%冷们现处理
预处理思想,缓存经常用
缓存中存放的是热门数据,放在内存的缓存中。
预处理是对缓存的一种应用,缓存服务器很重要
6.并行
原来打饭只有一个窗口,现在开两个窗口,现在就有两个窗口可以同时进行执行任务了,这就是并行的概念。
并行是并发的一种解决方案,也就是可以用并行的手段来解决并发。并行是同一时刻执行。
7.提速
8.消息中间件
中间件队列,在两个系统之间的存在,解决两个系统之间的耦合的
中间件buffer,两个系统之间的队列
解决两套系统之间的数据的缓存问题
每个软件常用的,就那么多,功能很冗余
项目中不能追求完美,够用就好