并发

并发(技术来源于生活)

并发模型举例

学校食堂打饭模型

学校中午下课后,学生蜂拥至食堂。此时食堂要处理学生打饭用餐问题,这就是并发。

并发和并行的区别

并发,concurrency

强调一段时间内,有这么多事情需要处理。

并行

在单位时间内,有多个窗口同时为学生提供服务,这就是并行。

并发的解决

1.队列,缓冲曲

假设只有一个窗口,陆续涌入食堂的学生排队打饭是比较好的方式。
所以排队(队列)是一种天然解决并发的办法。
排队就是把人排成队列,先进先出,解决了资源使用的问题。
排成的的队列,其实就是一个缓冲地带,就是缓冲区

假设女生优先,那么这个窗口就得是两队,只要有女生来就可以先打饭,男生队列等着,那么女生队列就是一个优先队列

例如queue模块的类Queue,LifoQueue,PriorityQueue

2.争抢,锁

只开了一个窗口,有可能没有秩序,也就是谁挤进去就给谁打饭。
挤到窗口的人占用窗口,直到打到饭离开。
其他人继续争抢,这时会有一个人占据着窗口,可以视为窗口被该学生锁定,此窗口就不能为其他人提供服务了,这是一种锁机制。谁抢到资源就上锁,排他性的独占锁,其他人只能等待。

争抢也是一种高并发的解决方案,但是这样可不好,因为有可能有人很长时间抢不到资源。

如果锁打不开就成了死锁,死锁分为两种,一种是多人参与的(双方都等着对方先开锁,先放手),另一种是自己打不开了。

3.预处理,缓存

其实排长队问题也不大,如果排队人数固定,但是某些人打饭时间很长,因为她要吃的菜没有,这时厨房才开始去买菜做饭…。没打着饭的人不走开(锁定着窗口),就消耗了大量的时间。
食堂可以提前统计大多数人最爱吃的菜品,将最爱吃的80%的热门菜提前做好保证供应,剩下20%的冷门菜可以现做。

这样大多数人就算锁定了窗口,也会很快释放掉的。这就是一种提前加载用户需求的数据思想,预处理思想,缓存常用。

4.并行

成百上千人同时来吃饭,一个窗口搞不定就再开一个,如同交通拥堵开多个车道一样,并行打菜。
但是多开窗口就得扩大食堂,就得多雇人提供服务,造成成本上升。

日常可以通过购买更多服务器,或多开进程线程实现并行处理,来解决并发这些思想都是**水平扩展(并行)**思想。

注:
如果线程在单cpu上处理,就不是并行了。
但是多数服务器都是多cpu的,服务的部署往往是多机的,分布式的,这都是并行处理。

5.提速

提高单个窗口的打饭速度,也是解决并发的方式。
打饭人员提高工作技能,或为单个窗口配备更多服务人员,都是提速的方法。
提高单个cpu的性能,或单个服务器安装更多的cpu。

这是一种垂直提升思想,但是成本会上升。是水平还是垂直取决于看问题角度。

6.消息中间件(消息队列)

上地,西二旗地铁站外的九曲回肠的走廊,缓冲人流,进站之后再多口安检。

常见的消息中间件有RabbitMQ,Active MQ(Apache),RpcketMQ(阿里Apache),kafka(Apache)等。

常见的消息中间件有RabbitMQ,Active MQ(Apache),RpcketMQ(阿里Apache),kafka(Apache)等。

当然还有其他手段解决并发问题,但是已经列举出了最常见的解决方案,一般来说不同的并发场景用不同的策略,而策略可能是多种方法的优化组合。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值