并发(技术来源于生活)
并发模型举例
学校食堂打饭模型
学校中午下课后,学生蜂拥至食堂。此时食堂要处理学生打饭用餐问题,这就是并发。
并发和并行的区别
并发,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)等。
当然还有其他手段解决并发问题,但是已经列举出了最常见的解决方案,一般来说不同的并发场景用不同的策略,而策略可能是多种方法的优化组合。