同步调用 异步调用+回调机制


1 同步调用 异步调用+回调机制
提交任务的两种方式:
同步调用 :提交任务必须等待任务完成,才能执行下一行
异步调用 :提交任务不需要等待任务完成,立即执行下一行
任务执行的三种状态:
阻塞
阻塞 遇到了IO操作 代码卡主 无法执行下一行 CPU会切换到其他任务
非阻塞:
就绪
运行

异步回调 ******
什么是异步回调?
在发起异步任务后 子线程或子进程 完成任务后需要通知任务发起方
如何通知 就调用一个函数
为什么需要回调?
由于任务是异步执行 任务发起方不知道啊什么时候完成
所以使用回调的方式告诉发起方任务执行结果 其他方式也可以将数据交还给主进程
1.shutdown 主进程会等到所有任务完成
2.result函数 会阻塞直到任务完成
都会阻塞 导致效率降低 所以使用回调
注意点:
回调函数什么时候被执行? 子进程任务完成时
谁在执行回调函数? 主进程
线程的异步回调:
使用方式都相同 唯一的不同是执行回调函数 是子线程在执行

2.线程队列 ***
队列
堆栈
优先级队列

3、单线程下实现并发(***)
什么是协程:
单线程下实现并发,在应用程序级别实现多个任务之间切换+保存状态
并发:看起来是同时运行
并发实现的本质=切换+保存状态
切换:
1、遇到IO阻塞会切换(可以提升运行效率)
2、占用cpu时间过长或者有一个优先级更高的任务抢走了cpu

为什么需要协程
因为GIL的存在 同一时间只有一个线程在执行 如果只有单核没有问题
但是无法利用多核资源 只有尽可能提升单线程的效率
主线和子线切换是随机的

协程的实现
1 yield 把函数做成了生成器 生成器会自动保存状态
2 greenlet 帮我们封装yield 可以实现任务切换
创建对象时 制定任务就是函数 在函数中手动来switch切换任务
3 gevent 在greenlet的基础上封装了检测IO


协程的应用场景:
(没有IO绝对不使用协程) TCP 多客户端实现方式

总结点:
单线下实现并发 将io阻塞时间用于执行计算 可以提高效率 原理:一直使用CPU直到超时

猜你喜欢

转载自www.cnblogs.com/du-jun/p/9963301.html
今日推荐