占用的资源:进程>线程>协程
进程:先加载程序A的上下文,然后开始执行A,保存程序A的上下文,调入下一个要执行的程序B的程序上下文,然后开始执行B,保存程序B的上下文
进程的颗粒度太大,每次都要有上下的调入,保存,调出。
线程:一个软件的执行不可能是一条逻辑执行的,必定有多个分支和多个程序段,就好比要实现程序A,实际分成 a,b,c等多个块组合而成;这里的a,b,c就是线程,也就是说线程是共享了进程的上下文环境,的更为细小的CPU时间段
https://www.zhihu.com/question/25532384/answer/81152571--zhonyong的回答
进程只是资源分配的单位,线程才是cpu执行的单位
所以一般情况下,线程是可以用到多核的
只不过,在python中就比较特殊,本来创建了多个线程,但python解释器对外声称每个时间片只有一个线程要运行,所以对cpu来讲,只能看到一个线程,就变成单线程了;都是GIL搞的鬼
(GIL锁原因:刚开始单线程够用了,而且完美解决线程安全问题;现在就苦逼了。。。)
基于这种情况,出现了补救措施:multiprocessing
python解释器给multiprocessing.Process的每个对象都给了一把锁玩,所以是真的多任务
并发/并行:多个任务,一个核执行就是并发;每个任务都有一个核执行,就是并行
python中的多线程就是并发,多进程才是并行
即并行/并发与是不是线程没关系,只和任务数/核心数有关系;如果没有GIL,多线程也能实现并行
(之前以为只要是多线程就一定是并发,即单个cpu手忙脚乱一会执行这个一下,一会又去执行那个一下;实际上,cpu的眼里只有线程,所以才说线程是cpu调度的单位)
单线程/多线程:
①
代码是计算密集型的,单线程比多线程快,多线程执行1000命令后就会被GIL切换掉,而切换是要消耗资源的;
计算密集型的多任务:multiprocessing创建多进程,真的多任务,每个进程有各自的GIL
②
代码是io密集型的,多线程更快,因为有的切换,单线程都没得切换,只能等
io密集型的线程与协程:协程更快,因为是在线程内切换,线程层面都不切的
但一般程序并不是纯io,也是有计算的,所以这就是协程的缺点,毕竟是单线程的;所以线程的优势就又体现出来了
只能这么比较通俗的讲,底层还有用户线程/内核线程什么的 (这篇看着还不错,基本清晰),即该开始只有进程,没有线程,但进程太麻烦了,所以应用级搞了个线程,但内核不支持线程这个东西,依旧按进程来调;后来内核支持了线程,即调的是线程了
最根本的还是要看一本操作系统原理的书,才能理解透彻了
原文地址:https://www.cnblogs.com/justaman/p/11479963.html