多线程/多进程/协程

占用的资源:进程>线程>协程


进程:先加载程序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