-
多任务
什么是多任务
同时做多件事件(做个多个任务),运行多个方法
多任务的原理
并发:假的多任务,时间片的轮转,快速的交替运行任务
并行:真的多任务,一个核处理一个任务
实现多任务的三种方式
线程
进程
协程
- 线程
概念:程序执行的最小单位,依赖于进程
特点
程序运行起来,就给它创建了一个主线程,等待子线程结束后再结束
共享全局变量,通过args参数给线程传递数据
从系统开销讲,进程>线程>协程
互斥锁
主要解决了资源竞争的问题
使用互斥锁最主要注意:死锁问题
原因:两个线程都在等待对方释放锁
解决方案:
写代码设计的时候避免
设置超时时间
银行家算法
进程
概念:它是代码和资源的集合,分配资源的最小单位,可以在任务列表中查看进程
特点
程序运行起来,就会给其创建一个主进程,等待子进程结束后,再结束
进程调用start()方法后就进入了运行态
写时拷贝处理数据,通过args给进程传递数据
从系统开销讲,进程>线程>协程
进程间通信使用Queue
作用:多个进程之间传递数据
写法
创建队列对象q=multiprocessing.Queue()
一个进程给队列中放消息q.put()
另一个进程从队列中去消息q.get()
进程池
为什么要用进程池?
减少了创建、销毁进程的次数,从而提交效率
原理
一次性在进程池中创建多条进程,循环着去使用
写法
创建进程池po=multiprocessing.Pool()
加入任务 po.aplay_async()
关闭po.close
应用场景
任务比较多的时候
不知道有多少个任务的时候
- 协程
什么是可迭代对象
一个普通的对象实现了iter内置函数
什么是迭代器
一个普通的对象实现了iter和next内置函数
迭代器的特点
保存的是生成数据的方式,而不直接存储数据
好处:节省系统空间
什么是生成器
它是一个特殊的迭代器
yield
一个普通的函数里面写了yield的话,他就是一个生成器模板
执行函数遇到yield会阻塞
调用next()或者send()会解阻塞
利用yield做协程
写多个函数,每个函数中都写yield,函数执行时遇到yield就会阻塞
然后交替着题调用不同任务的next()方法,这样就用协程实现了多任务
原理:
利用线程的空闲时间去执行其他的任务
特点:
协程依赖于线程,线程依赖进程
从系统开销讲,进程>线程>协程
实现协程的三种方式
yield next() send()
greenlet
gevent
gevent.spawn(函数名).join()
gevent.joinall([gevent.spawn(函数名)])