1、并行
并行:指的是任务数小于等于cpu核数,即任务真的是一起执行的。
2、并发
并发:指的是任务数多于cpu核数,通过操作系统的各种任务调度算法,实现用多个任务“一起”执行(实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去一起执行而已)。
3、并发的优点
- 响应速度快:同时处理多个请求,响应时间较快。复杂的业务操作可以拆分为多个线程去执行加快了速度。
- 设计在某些情况下更简单设计:程序在某些情况下,可以更简单更高效,选择性更多
- 资源利用率好:CPU可以在空闲时可进行复用,例如在等磁盘和网络IO的时候,做一些其他的事情。
- 提高系统性能
4、并发的缺点
- 安全性:多个线程执行相同的程序,可能会出现线程安全的问题,也就是与实际期望不符的结果
- 活跃性:某个操作执行不下去,可能会发生死锁和饥饿等问题。
- 性能:线程过多,CPU频繁切换,增加了调度时间。线程过多会消耗过多的内存。
5、并发的问题
假如一件商品的库存只有5件,A用户买5个,B用户买5个,两个用户同时发起对同一个商品的下单请求,先查询商品库存,再修改商品库存,会出现资源竞争问题,导致库存的最终结果出现异常。
6、解决并发的方法
(1)乐观锁
乐观锁并不是真实存在的锁,而是在更新的时候判断此时的库存是否是之前查询出的库存,如果相同,表示没人修改,可以更新库存,否则表示别人抢过资源,不再执行库存更新。
并发量低的时候使用乐观锁,但乐观锁循环耗费时间。
(2)悲观锁
当查询某条记录时,即让数据库为该记录加锁,锁住记录后别人无法操作。
并发量高的时候使用悲观锁,但加锁消耗资源,并且容易造成死锁。
(3)任务队列
将下单的逻辑放到任务队列中(如celery),将并行转为串行,所有人排队下单。比如开启只有一个进程的Celery,一个订单一个订单的处理。