协程
协程,又称微线程,纤程。英文名Coroutine
协程是啥
协程是python个中另外一种实现多任务的方式,
只不过比线程更小占用更小执行单元(理解为需要的资源)。
通俗的理解:
在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的,并且切换的次数以及什么时候再切换到原来的函数都由开发者自己确定。
协程的优点
最大的优势就是协程极高的执行效率。因为函数切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。
第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
gevent
gevent 是一个第三方库。
Python中仅提供了对协程的基本支持,但是不完全。而第三方的gevent为Python提供了比较完善的协程支持。
其原理是当一个任务西数遇到lO(指的是input output 输入输出,比如网络、文件操作等)操作时,比如访问网络,就自动切换到其他的任务函数执行,等到IO操作完成,再在适当的时候切换回来继续执行。
由于lO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有任务西数在运行,而不是等待IO,得以实现多任务,提高程序执行效率。
安装
pip3 install gevent # 国内源 pip install -i https://pypi.douban.com/simple/ gevent使用gevent
```python
1. 导入gevent
import gevent
def sing(singer, song): for i in range(5): print(f'{singer}正在唱歌{song}')
# gevent 遇到 I/O 耗时阻塞操作,会切换协程
gevent.sleep(0.1) # 切换协程
def dance(dancer, name): for i in range(8): print(f'{dancer} 正在跳舞{name}------') gevent.sleep(0.1)
if name == 'main':
# 创建协程对象
g1 = gevent.spawn(sing, '张学友', '饿狼传说')
g2 = gevent.spawn(dance, '刘德华', '假装')
# 阻塞协程对象 必须要添加阻塞不然不会执行
g1.join()
g2.join()
6. 协程猴子补丁
```python
# 1. 导入gevent
import time
import gevent
from gevent import monkey
monkey.patch_all() # 使用 gevent 中的模块替换系统中的模块
def sing(singer, song):
for i in range(5):
print(f'{singer}正在唱歌{song}')
# gevent 遇到 I/O 耗时阻塞操作,会切换协程
# gevent.sleep(0.1) # 切换协程
time.sleep(0.1)
def dance(dancer, name):
for i in range(8):
print(f'{dancer} 正在跳舞{name}------')
# gevent.sleep(0.1)
time.sleep(0.1)
if __name__ == '__main__':
# 创建协程对象
g1 = gevent.spawn(sing, '张学友', '饿狼传说')
g2 = gevent.spawn(dance, '刘德华', '假装')
# 阻塞协程对象 必须要添加阻塞不然不会执行
g1.join()
g2.join()