什么是协程
1、协程作用
协程不是计算机自带的功能,而是人们的一种理念,协程的主要作用就是:当你的程序遇到了阻塞(耗时操作)时,程序在等待当前程序运行时顺便去执行另一程序
比如在爬虫的过程中,你爬取别的的视频或图片的时候,初级的程序就是循环遍历,一张一张爬取,而协程操作就会在下载等待第一张图片的同时下载第二张…实现协程异步爬虫
协程的实现
1、greenlet实现协程
from greenlet import greenlet
def fun1():
print("第一条语句!")
gr2.switch()
print("第二条语句! ")
gr2.switch()
def fun2():
print("第三条语句! ")
gr1.switch()
print("第四条语句! ")
gr1 = greenlet(fun1)
gr2 = greenlet(fun2)
gr1.switch()
打印结果:
第一条语句!
第三条语句!
第二条语句!
第四条语句!
创建两个greenlet对象(gr1 gr2)一个greenlet就相当于一个微线程,在程序执行时调用switch函数,跳转到另一greenlet中,反复横跳。实现线程作用。
2、yield实现协程
def funa1():
yield 1
yield from funa2()
yield 2
def funa2():
yield 3
yield 4
f = funa1()
for item in f:
print(item)
运行结果:
1
3
4
2
有yield的函数体返回的是一个“迭代器”,借用关键字“yield”的特点,让当前语句返回数字后挂起,相当于return语句,但不同的是当再次调用时会从yield关键字下一句开始执行,通过若干yield关键字俩实现协程处理,但该方法不常用与实现协程。
3、asyncio&await实现协程
import asyncio
async def func1():
print("第一条语句!")
await asyncio.sleep(2)
print("第二条语句! ")
async def func2():
print("第三条语句! ")
await asyncio.sleep(2)
print("第四条语句! ")
test = [
asyncio.ensure_future(func1()),
asyncio.ensure_future(func2())
]
# 生成一个事件循环
loop = asyncio.get_event_loop()
# 将asyncio.wait(test)放到列表中依次执行直到结束
loop.run_until_complete(asyncio.wait(test))
运行结果:
第一条语句!
第三条语句!
第二条语句!
第四条语句!
通过“asyncio”实现协程是最常用的方法,但仅限于python3.4版本及以后,上面的await方法配合使用是python3.8版本开始的使用。python3.7后 后两句可换为 asyncio.run(test)。