最近⾯试的⼏个问题(⼀)进程和线程、协程的区别
现在多进程多线程已经是⽼⽣常谈了,协程也在最近⼏年流⾏起来。python中有协程库gevent,py web框架tornado中也⽤了gevent封装好的协程。本⽂主要介绍进程、线程和协程三者之间的区别。
⼀、概念
1、进程
进程是具有⼀定独⽴功能的程序关于某个数据集合上的⼀次运⾏活动,进程是系统进⾏资源分配和调度的⼀个独⽴单位。每个进程都有⾃⼰的独⽴内存空间,不同进程通过进程间通信来通信。由于进程⽐较重量,占据独⽴的内存,所以上下⽂进程间的切换开销(栈、寄存器、虚拟内存、⽂件句柄等)⽐较⼤,但相对⽐较稳定安全。
2、线程
线程是进程的⼀个实体,是CPU调度和分派的基本单位,它是⽐进程更⼩的能独⽴运⾏的基本单位.线程⾃⼰基本上不拥有系统资源,只拥有⼀点在运⾏中必不可少的资源(如程序计数器,⼀组寄存器和栈),但是它可与同属⼀个进程的其他的线程共享进程所拥有的全部资源。线程间通信主要通过共享内存,上下⽂切换很快,资源开销较少,但相⽐进程不够稳定容易丢失数据。
3、协程
协程是⼀种⽤户态的轻量级线程,协程的调度完全由⽤户控制。协程拥有⾃⼰的寄存器上下⽂和栈。协程调度切换时,将寄存器上下⽂和栈保存到其他地⽅,在切回来的时候,恢复先前保存的寄存器上下⽂和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下⽂的切换⾮常快。
⼆、区别:
1、进程多与线程⽐较一个线程可以包含多个进程
线程是指进程内的⼀个执⾏单元,也是进程内的可调度实体。线程与进程的区别:
1) 地址空间:线程是进程内的⼀个执⾏单元,进程内⾄少有⼀个线程,它们共享进程的地址空间,⽽进程有⾃⼰独⽴的地址空间
2) 资源拥有:进程是资源分配和拥有的单位,同⼀个进程内的线程共享进程的资源
3) 线程是处理器调度的基本单位,但进程不是
4) ⼆者均可并发执⾏
5) 每个独⽴的线程有⼀个程序运⾏的⼊⼝、顺序执⾏序列和程序的出⼝,但是线程不能够独⽴执⾏,必须依存在应⽤程序中,由应⽤程序提供多个线程执⾏控制
2、协程多与线程进⾏⽐较
1) ⼀个线程可以多个协程,⼀个进程也可以单独拥有多个协程,这样python中则能使⽤多核CPU。
2) 线程进程都是同步机制,⽽协程则是异步
3) 协程能保留上⼀次调⽤时的状态,每次过程重⼊时,就相当于进⼊上⼀次调⽤的状态
三、进程和线程、协程在python中的使⽤
1、多进程⼀般使⽤multiprocessing库,来利⽤多核CPU,主要是⽤在CPU密集型的程序上,当然⽣产者消费者这种也可以使⽤。多进程的优势就是⼀个⼦进程崩溃并不会影响其他⼦进程和主进程的运⾏,但缺点就是不能⼀次性启动太多进程,会严重影响系统的资源调度,特别是CPU使⽤率和负载。使⽤多进程可以查看⽂章《》。注:python2的进程池在类中的使⽤会有问题,需要把类函数定义成全局函数。具体可参考 bbs.chinaunix/thread-4111379-1-1.html
2、多线程⼀般是使⽤threading库,完成⼀些IO密集型并发操作。多线程的优势是切换快,资源消耗
低,但⼀个线程挂掉则会影响到所有线程,所以不够稳定。现实中使⽤线程池的场景会⽐较多,具体可参考《》。
3、协程⼀般是使⽤gevent库,当然这个库⽤起来⽐较⿇烦,所以使⽤的并不是很多。相反,协程在tornado的运⽤就多得多了,使⽤协程让tornado做到单线程异步,据说还能解决C10K的问题。所以协程使⽤的地⽅最多的是在web应⽤上。
总结⼀下就是IO密集型⼀般使⽤多线程或者多进程,CPU密集型⼀般使⽤多进程,强调⾮阻塞异步并发的⼀般都是使⽤协程,当然有时候也是需要多进程线程池结合的,或者是其他组合⽅式。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论