GIL
什么是GIL 全局解释器锁,本质是一把互斥锁,是加在cpython解释器上的一把锁, 同一个进程内的所有线程需要先抢到GIL锁,才能执行python代码为什么要有GIL
cpython解释器的内存管理机制是非线程安全的GIL与自定义互斥锁的区别:
相同:都是互斥锁 不同:GIL是加在解释器身上,全局的 自定义作用于局部 单进程内所有线程都会去抢GIL 局部线程会去抢自定义互斥锁GIL的优缺点:
优点:保证了cpython解释器内存管理的线程安全 缺点:同一进程内的所有线程同一时刻内只有一个可以执行,不能并行线程线程池,进程池
池:装固定数目的进程or线程 为什么要用:让机器在自己可承受的范围内去保证一个高效的工作 from concurrent.futures import ThreadPoolExecutor ,ProcessPoolExecutor pool= ProcessPoolExecutor(4) future = pool.submit(task,arg1,arg2...)是一种异步提交任务的方式 pool.shutdown()指的是不能再往进程池内提交任务,wait = True 等待进程池或线程池内所有的任务都运行完毕 future.result()获取结果,#异步提交任务,串行的获取结果什么时候用多进程,什么时候用多线程:
单进程下的多个线程是无法并行,无法并行意味着不能利用多核优势 cpu干的是计算的活,多个cpu意味着提升了计算性能 cpu是无法做IO操作的,多个CPU在IO操作前毫无用处 当我们的程序是IO密集型时,多核对性能的提升微不足道,此时可使用多线程 当我们的程序是计算密集型时,一定要用上多核优势,可以使用多进程阻塞与非阻塞:
阻塞:遇到IO就发生阻塞,程序一旦遇到阻塞操作就会停在原地,并且立即释放CPU资源 非阻塞(就绪或运行态):没有遇到IO操作,或者通过某种手段让程序即便是遇到IO也不会停在原地同步与异步指的是提交任务的两种方式
同步调用:提交完任务后,就在原地等待,直到任务运行完毕后,拿到任务的返回值,才继续执行下一行代码 异步调用:提交完任务后,不在原地等待,直接直接下一行的代码