Python gevent学习(一) 进程,线程,协程

来源:互联网 发布:关于c语言的书 编辑:程序博客网 时间:2024/06/05 20:49

每次一想到进程, 线程,协程,只是有一个模模糊糊的概念,所以这次打算总结下这三者的区别与应用场景,加深下印象(没耐心,直接看最后面的)。

操作系统角度:

调度分配
进程:进程是操作系统分配资源的一个独立单位。创建一个进程开销较大
线程:线程是操作系统调度分派的基本单位。一个进程可以创建多个线程,所以开销较小。

资源空间
进程:有自己独立的空间,因此进程间切换开销比线程大,但是进程间独立性较高,除了共享的全局变量外,不允许其他进程访问当前进程空间
线程:在同一进程间的多线程共享资源,从而线程间切换比较小,但是独立性差。

注:不管是进程间或者是线程间切换都是有操作系统内核完成的,但是协程间的调度完全由用户来控制。

通信:
进程间不共享任何状态,所以进程间通讯效率比较低(但是还是能够通过信号量,管道,时间等方式进行通讯)某一进程崩溃也不会影响其他无关进程。
线程间共享变量,所以通讯效率比较高,但是对于变量的访问需要锁。

协程:
因为目前主要是数据采集涉及到了IO瓶颈问题,而协程就是能够暂时性的解决IO问题。为什么协程就能够比线程较高的解决IO问题呢? 主要是因为线程间切换是要通过系统内核来操作,但是协程的话任务间的切换只需要保存每个任务的之前的状态,就可以进行下一个协程,协程间的切换如同调用栈(为什么会是栈,因为协程是非抢占式的,就是按照顺序执行的,线程是抢占式的)里面的东西一样,所以切换成本大大降低。

简单几句话
进程
进程是正在运行程序的实例。
优点:具有独立地址空间,是操作系统资源分配的基本单位。
缺点:创建销毁成本高

线程:
线程是程序执行的最小单位。
多线程优点:提高程序的并发性(但是IO密集型会导致线程间阻塞,cpu利用率不高)
缺点线程开销比进程低,但切换成本高,线程间同步变成复杂。

协程:
特点:协程可以认为是一种用户态的线程, 切换成本较低,控制权在程序员手上。

缺点:协程不陷入内核的情况进行上下文切换,没有同步问题,但需要手动切换。而且协程间是基本上没有同步通讯。

使用场景:
根据进程,线程,协程的特点进行使用。

多进程一般适用于:进程间需要独立
多线程一般适用于:线程间需要通讯,并且并发量要求比较高
协程:适用于IO密集,并且非抢占式。

以上纯属个人理解,望大牛不喜轻喷。

0 0