11.13
一、同步 异步 阻塞 非阻塞
线程的三种状态:
1.就绪
2.运行
3.阻塞
阻塞 遇到了IO操作 代码卡主 无法执行下一行 CPU会切换到其他任务
非阻塞 与阻塞相反 代码正在执行(运行状态) 或处于就绪状态
阻塞和非阻塞描述的是运行的状态
同步 :提交任务必须等待任务完成,才能执行下一行
异步 :提交任务不需要等待任务完成,立即执行下一行
指的是一种提交任务的方式
二、异步回调
为什么需要回调?
子进程帮助主进程完成任务 处理任务的结果应该交还给准进程
其他方式也可以将数据交还给主进程
1.shutdown 主进程会等到所有任务完成
2.result函数 会阻塞直到任务完成
都会阻塞 导致效率降低 所以使用回调
注意:
回调函数什么时候被执行? 子进程任务完成时
谁在执行回调函数? 主进程
线程的异步回调
使用方式都相同 唯一的不同是执行回调函数 是子线程在执行
三、线程队列
普通队列 先进先出
q = queue.Queue()
堆栈队列 先进后出 后进先出 函数调用就是进栈 函数结束就出栈 递归造成栈溢出
q2 = queue.LifoQueue()
优先级队列,数值越小优先级越高 优先级相同时 比较大小 小的先取
q3 = queue.PriorityQueue()
四、协程
协程的目的是在单线程下实现并发
为什么出现协程? 因为cpython 由于GIL 导致同一时间只有一个线程再跑
意味着 如果你的程序时计算密集 多线程效率也不会提升
如果是io密集型 有没有必要再单线程下实现并发
没有 我会开启多线程来处理io 子线遇到io cpu切走 但是请问 你能保证一定切到主线吗? 不能保证
有 如果可以 我在遇到io的时候转而去做计算 这样一来可以保证cpu一直在处理你的程序 当然时间太长也要切走
总结一下:单线下实现并发 将io阻塞时间用于执行计算 可以提高效率 原理:一直使用CPU直到超时