协程
1. 引入概念
之前我们学习了进程、线程的概念,现在又出现了协程的概念,那协程是不是由线程引发出的比线程更小的单位?
打住,不是你想的那样。协程的本质就是在单线程下,由用户自己控制一个任务遇到io阻塞了就切换另外一个任务去执行,以此来提升效率。它可以控制多个任务之间的切换,切换之前将任务的状态保存下来,以便重新运行时,可以基于暂停的位置继续执行。
2.协程的优缺点
-
优点
- .协程的切换开销更小,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级
- 单线程内就可以实现并发的效果,最大限度地利用cpu
-
缺点
- 协程的本质是单线程下,无法利用多核,可以是一个程序开启多个进程,每个进程内开启多个线程,每个线程内开启协程
- 协程指的是单个线程,因而一旦协程出现阻塞,将会阻塞整个线程
-
举例:
-
# 协程原理 def eat(): print('吃着呢') # 3 time.sleep(1) # 4这时候遇到io阻塞,它会自动识别然后跳转到下个线程执行而不是等待 print('吃完了') #7 def play(): print('玩着呢') # 5 time.sleep(1) # 6 与4一样遇到阻塞,执行别的不等待进程。可是没有,只好等待eat的 print('玩完了') # 8 # 1秒后,执行下一步 g1 = gevent.spawn(eat) # 1 g2 = gevent.spawn(play) # 2 g1.join() # 加join的效果; 如果不加的话就表示,启动了两个线程 并且两个线程的内容还 g2.join() # 没有执行完就结束了
-
输出结果
-
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190829100352698.png)
-
解释:
一开始会输出:吃着呢 玩着呢 等待1秒后,输出吃完了 玩完了。具体执行步骤 代码后面的序号作为解释。