- 协程由用户态控制,不由内核控制
- 1个线程中可以开很多协程
- 协程切换是在用户态控制不由内核控制,切换时资源开销小
- 使用方式:async def、await+可等待对象(协程对象、Future对象、task对象(是Future对象的子类)->io等待)、事件循环
- 使用场景:可以使用与I/O密集型场景
- 锁的使用:三种场景,[1] 如果协程在操作共享变量的过程中,没有主动放弃执行权(await),也就是没有切换挂起状态,那就不需要加锁,执行过程本身就是安全的,换句话说只要协程中没有await关键字旧不需要加锁操作;[2] 可是如果在执行事务逻辑块中主动放弃执行权了,会分两种情况,[2.1]如果在逻辑执行过程中我们需要判断变量状态,或者执行过程中要根据变量状态进行一些下游操作,则必须加锁,[2.2] 如果我们不关注执行过程中的状态,只关注最终结果一致性,则不需要加锁。【 是的,抛开剂量谈毒性,是不客观的,给一个健康的人注射吗啡是犯罪,但是给一个垂死的人注射吗啡,那就是最大的道德,所以说,道德不是空泛的,脱离对象孤立存在的,同理,抛开场景谈逻辑,也是不客观的,协程也不是虚空的,脱离具体场景孤立存在的,我们应该养成具体问题具体分析的辩证唯物思想,只有掌握了辩证的矛盾思维才能更全面更灵活的看待问题,才能透过现象,把握本质。】更详细的可以查看协程(asyncio)到底需不需要加锁?