当单任务不能满足工作的需要,只是需要使用多任务,多任务分为多进程,多线程,多协程
先有进程,进程创建线程,线程依附于进程,线程里面包含多个协程
进程是系统资源调配的基本单位,线程是系统调度的基本单位,是代码执行的分支,协程是比线程占用资源还小的执行单元,它自带cpu的上下文,他可以在不开辟线程的基础上来实现多任务。
创建一条进程需要向操作系统索要资源,创建线程需要向对应的进程索要资源,创建协程需要向相应的线程索要资源,所以,进程最是消耗资源,其次线程,最后协程
进程之间不共享全局变量,需要靠queue队列来进行各个进程间的通信。线程间共享全局变量,但其中会出现资源竞争,这时需要使用同步方法即子进程加入主进程,或者互斥锁,在使用互斥锁时可能会出现死锁,这时我们需要对其进行手动解锁,可以使用延时或者银行家算法
进程和线程里面是无序的,主进程或者线程需要等到子进程或线程结束才会结束。如果需要主进程结束同时子进程销毁,需要加入守护主进程或主线程,协程是按照一定的顺序来交替执行,主协程不会等待子协程结束而结束,这是需要将子协程加入主协程里面
进程和协程只能实现并发,协程可以实现并行
进程创建调用muilprocessing包里面的Process模块,线程创建调用threading里面的Thread模块,协程主要是调用封装好的geven模块
进程还可以使用进程池来创建,进程池是一个用来装多个进程的容器,进程池通过multiprocessing里面的Pool来创建。当需要大批量调用进程来工作,我们可以直接调用进程池,进程池的进程数量是可控的,即可以规定多少个进程同时工作。进程池里面的进程间的通信采用multiprocessing里面manage里面的queue队列来实现。主进程不会等待进程池结束后结束,这时我们需要关闭进程池不在接收子进程,然后加入主进程
多进程稳定性强,但耗费资源太多,一般用于计算密集型。多线程运行速度一般,消耗资源比进程要小,但由于gui锁的存在,线程不是真正意义上的多任务,一般不使用;协程运行速度快,消耗资源小于线程,一般多用于爬虫,网络服务请求
网友评论