1.概念
协程:协助程序,线程和进程都是抢占式特点,线程和进程的切换我们是不能参与的。
而协程是非抢占式特点,协程也存在着切换,这种切换是由我们用户来控制的。
协程主解决的是IO的操作。
协程,又称微线程,纤程。英文名Coroutine。
2.优点
优点1
协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。
优点2
不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。
3.利用yield简单实现协程
代码示例:
部分结果:
4.greenlet模块
概念
greenlet是一个用C实现的协程模块,相比与python自带的yield,它可以使你在任意函数之间随意切换,而不需把这个函数先声明为generator
greenlet模块
- gr1=greenlet(目标函数)
- gr1.switch() 切换执行
安装
pip3 install greenlet。如果引入的时候还是报错,使用pycharm进行下载安装,
选择 file --> settings --> Project:项目名称 --> Project Interpreter-->…
代码练习
import time,greenlet
def test1():
while True:
print('....test1....')
time.sleep(1)
g2.switch()
def test2():
while True:
print('....test2....')
time.sleep(1)
g1.switch()
if __name__=="__main__":
g1=greenlet.greenlet(test1)
g2=greenlet.greenlet(test2)
g1.switch()
print('程序结束了')
结果:
5.gevent模块
代码:
import gevent,time
from gevent import monkey
#打补丁
monkey.patch_all()
#如果程序中没有耗时操作就顺序执行
def test1():
for i in range(5):
print('....test1....',i)
time.sleep(1)#使用gevent.sleep()耗时操作
def test2():
for i in range(5):
print('....test2....',i)
time.sleep(1)
if __name__=="__main__":
g1=gevent.spawn(test1)#指定执行目标
g2=gevent.spawn(test2)
g1.join()#等待g1、g2指定的目标执行完后程序才往下执行
g2.join()
print('程序结束了')
结果: