了解并发编程之前,要先了解一下python的GIL全局解释器锁
多进程和多线程
GIL是在一段代码执行前,先把代码转成cpython,供CPU识别,GIL 保证CPython进程中,只有一个线程去执行字节码。甚至在多核的情况下,也只允许同时只有一个CPU运行一个线程的进程。
虽然GIL是一个互斥锁,但是它是不安全的 (比如开启多个线程,去数据库拿数据,比如拿了个用户,叫XX,他是5岁,一个线程得到是5岁,修改XX为4岁,然后sleep了5s,又去运行另一个线程,这个时候这个线程拿到的数据是5岁,其实应该拿到的是4岁,造成了数据混乱)
在CPython中由于有GIL存在,IO密集型,使用多线程较为合算;CPU密集型,使用多进程,要绕开GIL。
多进程:进程是资源调度的最小单位,一个进程可以运行多个线程,也可以只运行一个线程,(python的多线程,某种意义上也是单个线程运行的,只不过资源切换比较快,看不出来区别),计算密集型用多进程
多线程:由于线程之间是进行随机调度,并且每个线程可能只执行n条执行之后,当多个线程同时修改同一条数据时可能会出现脏数据, 所以出现了线程锁,即同一时刻允许一个线程执行操作。
并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任务“一起”执行(实际上总有一些任务不在执行,因为切换任务的速度相当快,看上去一起执行而已)