同步异步:
同步:发起一个任务以后,代码等待任务执行结束拿到结果才继续往下面执行代码
异步:发起一个任务后,不需要等待,代码继续往下执行
指的是任务的发起方式
异步任务的效率高于同步
应用场景:当你的任务是不需要立即获得结果的,并且还有其他的任务需要处理,就发起异步任务
如何发起异步任务:多线程 多进程
阻塞非阻塞:
阻塞:程序遇到了IO操作,导致代码无法继续执行,CPU执行权切到别的程序
非阻塞:程序执行没有遇到IO操作 或者 即使遇到了IO操作 也不阻塞代码执行
指的是应用程序所处的状态
写程序时,要尽量减少IO操作
同步与阻塞的区别:
阻塞一定意味着:CPU执行权切走了
而同步有可能是因为计算任务比较耗时
异步回调:
(add_done_callback)
获取异步任务结果的方式
回调:说的是回调函数,给异步任务绑定一个函数,当任务完成时会自动调用该函数
具体使用:
当你往poll中添加一个异步任务,会返回一个表示结果的对象
有一个对象绑定方法:add_done_callback 需要一个函数作为参数
注意:回调函数,必须且只能有一个参数 就是对象本身
通过对象的.result来获得结果
回调函数交给子线程来执行,谁有空谁处理
线程队列:
在queue模块下导入三个容器类,Queue,LifoQueue,PriorityQueue
Queue是正常的队列,先进先出,能够等待
LifoQueue是后进先出队列(堆栈)
PriorityQueue是优先级队列
事件:
事件是一个通知信息,表示什么时间发生什么事情
用于线程间通讯
线程间 本来就是数据共享的 也就是说,即使没有事件也没有问题
线程之间,执行流程是完全独立的,一些时候可能需要知道另一个
线程发生了什么然后才去一些行动
这个时候就可以使用事件来简化代码
使用方法
从 threading模块中导入Event 然后使用Event实例化一个对象
在一个线程执行到某一个特定代码时,使用实例化对象的set方法
然后再另一个线程使用wait方法直到等到一个线程的set方法生效
就完成了事件
协程:
协程就是要用单线程来实现并发
什么是协程:
协程指的是一个单线程并发执行多个任务
用于提高效率 在检测到IO操作时,切换到其他的非IO操作 这样一来
在操作系统眼里程序依然没有阻塞,力求尽可能的多占用CPU的执行权
为什么需要协程:
GIL导致多个线程不能并行,效率低
CPython中多个线程不能并行
所以为了能够提高效率,提高CPU的使用率,就需要协程
如何使用协程:
创建两个函数,一个函数使用yield函数暂停函数运行同时保存状态
另一个函数正常运行,每次循环调用生成器的next方法就是协程
greenlet模块:
greenlet函数是对yield函数做了封装
简化了书写,但是,它不能检测IO操作
Gevent模块:
gevent 可以实现单线程并发,还可以检测到IO操作
导入gevent函数,导入gevent.monkey函数
然后使用monkey函数的patch.all()方法给模块打上补丁
这样大部分的阻塞模块都会变成非阻塞模块