一、多任务:
在同一时间内执行多个任务.
并发:多任务在同一段时间内切换执行,基于时间片进行任务切换.
并行:在同一时刻,多个任务同时在执行,基于多个cpu的同时运行.
二、线程:
在程序运行过程中,程序中执行的一个分支,每个运行的程序至少有一个线程,即主线程.
多个子线程的执行顺序是无序的.
创建一个子线程:
多线程之间修改同一数据需要保持同步,称为线程同步,可以使用线程互斥锁实现.
主线程会等待所有子线程运行结束后才结束.
但是如果一个程序中只剩下daemon线程,则所有线程就会退出,就是说如果其他的线程都走完了,daemon线程最后没有走完,它也要随即结束.(这个和java中的类似)
自定义线程类:
三、进程:
通俗的说法,一个运行的程序或者软件,进程是操作系统资源分配的基本单位,每个进程都拥有自己的地址空间、内存等资源.
在一个程序中,默认创建一个进程,该进程中会默认创建一个线程.
线程的出现是由于进程切换时需要耗费大量的资源而发明的产物,它是操作系统执行调度程序的基本单位.
进程的三个状态:
1、就绪:运行的状态都已经具备了,就等着cpu执行(等待获取操作系统分配的时间片),若获取到时间片则进入运行状态;
2、运行:已分配到时间片,运行一段时间后,如果时间片结束则返回就绪状态,如果执行了阻塞任务(sleep等),则进入等待状态;
3、等待:等待着某些条件的满足,或某些任务完成,一旦满足了条件或完成了任务则进入就绪状态.
创建一个子进程:
主进程默认会等待所有子进程退出以后再退出.
两个进程之间不共享其内部的资源.
进程间的通信:
由于两个进程之间默认无法共享各自的内部资源,那么如果需要资源共享,如何实现?
Queue:一种专门用于进程间通信的队列,遵循先进先出.
Queue的使用:
进程池:
由一个控制进程与被控制进程统筹调度的一批准备好的进程组成.
采用进程池的方式可以节约大量的进程创建与销毁的资源开销.
实现一个进程池:
四、协程:
在单线程的基础上执行多任务的一种编码方式,由开发者实现,而不是像线程和进程一样由操作系统实现.
通过gevent实现协程:
注意:使用gevent,可以获得极高的并发性能,但gevent只能在Unix/Linux下运行,在Windows下不保证正常安装和运行.
线程、进程、协程的区别:
1、进程是资源分配的基本单位,线程是操作系统调度的基本单位,而协程的任务调度可以通过开发者控制;
2、进程切换时需要耗费大量资源,效率很低。线程次之。协程切换任务是消耗的资源很少,效率也高;
3、在多核cpu的计算机中,多进程与多线程可能是并行的,而协程基于线程,因此是并发的;
4、在python的多任务中,最好的方式是采用多进程+协程的方式实现,因为那个GIL锁的问题限制了python发挥多线程发的实力(可以查看那篇关于GIL锁的文章)
领取专属 10元无门槛券
私享最新 技术干货