python的线程,进程,协程

1.认识

线程:是CPU调度的基本单位,程序执行的最小单元,是进程中的一个实体用来执行程序,一个进程中有多个线程

进程:是操作系统进行资源分配的最小单元,资源包括CPU、内存、磁盘等IO设备等等,系统分配资源的载体,是程序运行的实例;

协程:协程也是线程,称微线程,自带CPU上下文,是比线程更小的执行单元;

2.区别

线程:一个程序至少有一个进程,一个进程至少有一个线程;线程的划分尺度小于进程(资源比进程少),使得多线程程序的并发性高;线程不能够独立执行,必须依存在进程中。

进程:进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率;进程不共享全局变量(创建子进程会对主进程资源进行拷贝,也就是说子进程是主进程的一个副本,好比是一对双胞胎,之所以进程之间不共享全局变量,是因为操作的不是同一个进程里面的全局变量,只不过不同进程里面的全局变量名字相同而已。)

协程:协程是一种用户态的轻量级线程,协程的调度完全由用户控制.协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快 占用内存极少;共享单线程的代码段、公有数据;切换的开销最小、速度最快(不用切换到内核态)

3.优缺点

线程:通信简单、数据同步复杂;一个线程挂掉会导致整个进程挂掉;创建、销毁及切换简单,速度快, 线程执行开销小,但不利于资源的管理和保护,同时线程适合于在SMP机器上运行。

进程:占用内存多;通信复杂、数据同步简单;各进程相互独立;创建、销毁及切换复杂,速度慢 占用内存少;但是有利于资源的管理和保护,进程可以跨机器迁移。

协程:协程的调度完全由用户控制,一个线程可以有多个协程,用户创建了几个线程,然后每个线程都是循环按照指定的任务清单顺序完成不同的任务,当任务被堵塞的时候执行下一个任务,当恢复的时候再回来执行这个任务,任务之间的切换只需要保存每个任务的上下文内容,就像直接操作栈一样的,这样就完全没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快;另外协程还需要保证是非堵塞的且没有相互依赖,协程基本上不能同步通讯,多采用一步的消息通讯,效率比较高。

4.Python中的进程与线程的使用场景?

多进程适合在CPU密集型操作(CPU指令比较多, 如位数多的浮点运算). 进程是并行;

多线程适合在IO密集型操作(读写数据操作较多的, 比如爬虫) 线程是并发,

进程之间相互独立, 是系统分配资源的最小单位, 同一个进程中的所有线程共享资源.

Python解释器由于设计时有GIL全局锁,导致了多线程无法利用多核。多线程的并发在Python中就是一个美丽的梦