多线程与CPU和多线程与GIL
Posted mryrs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程与CPU和多线程与GIL相关的知识,希望对你有一定的参考价值。
多线程与CPU:
1.单核CPU CPU密集型的程序(做计算操作的程序) 单线程即可( 此时的任务已经把CPU资源100%消耗了,就没必要也不可能使用多线程来提高计算效率)
2.单核CPU IO密集型的程序(做IO操作的程序 ) 多线程>单线程(多线程可以阻塞,但并不是并行,是“伪并行”,实际上还是一个CPU在执行一切事物,只是切换的太快,没法察觉)
3.多核CPU 做计算操作的程序 多线程>>单线程 (每个核心执行一个线程,每个核心的线程并发执行计算,以提高任务执行效率,例如加密解密,数据压缩解压缩(视频、音频、普通数据),否则只能使一个核心满载,而其他核心闲置。)
4.多核CPU IO密集型任务 多线程>单线程
但是在PYTHON里:
由于GIL的机制就变得不完全一样了:单核CPU CPU密集型程序 单线程耗时<多线程。多核CPU CPU密集型程序 单线程耗时<多线程,也就是说只要是CPU密集型程序 不要只单独的使用多线程。
一、先说为什么会有GIL ,GIL是干什么的:
多线程之间数据完整性和状态同步的最简单方法自然就是加锁,于是python解释器有了GIL这把超级大锁,就默认python内部对象是thread-safe的,无需在实现时考虑额外的内存锁和同步操作。
也就是说 如果不释放这把锁,线程都是串行的。
但PYTHON的多线程并不是一无是处
二、GIL锁的释放机制:
IO密集型:
线程遇到I/O阻塞时,会自动释放GIL。(阻塞等待时,就释放GIL,给另一个线程执行的机会)
cpu密集型:
解释器会周期性的让线程释放锁
由上面可知,至少有两种情况python会做线程切换,一是一但有IO操作时,会有线程切换,二是当一个线程连续执行了一定数量的指令时,会出现线程切换。
再加上每次操作系统执行线程的调度都需要消耗时间,这样,就可以理解为什么在多核+cpu密集型程序时不要单独的使用多线程,会比单线程更耗时。
即使是多核CPU,如果没有GIL 不同核的CPU执行不同的线程,但是有了GIL这把锁,某个核心上的CPU即使被唤醒也没有获得GIL锁,无法执行。
综上,在不使用别的库的情况下,python多线程最好只用于IO密集型的操作。
参考:https://blog.csdn.net/delacroix_xu/article/details/5928121
http://cenalulu.github.io/python/gil-in-python/
以上是关于多线程与CPU和多线程与GIL的主要内容,如果未能解决你的问题,请参考以下文章