Python -协程案例-原理简介
Python协程实现原理
- 利用Python中yield关键字修饰函数使其成为生成器
- 利用生成器特点:可迭代且是从yield修饰处开始
- 协程近似函数调用,因此所用的资源少于进程和线程
- 可实现并发操作
- 以下为原理测试代码
def test_1():
while True:
print("----1---")
time.sleep(1)
yield
def test_2():
while True:
print("----2---")
time.sleep(1)
yield
t1 = test_1()
t2 = test_2()
for i in range(4):
next(t1)
next(t2
简单利用协程案例
- 使用利用上述原理封装的库:gevent
- 接下来 多打代码少动脑
- monkey.patch_all() 用于协程打补丁
- gevent.joinall([]) 用于开始多个协程
- gevent.spawn(function,…)传入协程执行的函数,及其他参数
- 由于爬取图片耗时最长就在等待响应和下载过程,多张图片的爬取这个过程,通过并发即可提高效率
import urllib.request
import gevent
from gevent import monkey
monkey.patch_all()
def download(img_name,url):
req = urllib.request.urlopen(url)
img_content = req.read()
with open(img_name,"wb") as f:
f.write(img_content)
def main():
gevent.joinall([
gevent.spawn(download,"1.jpg","https://rpic.douyucdn.cn/live-cover/appCovers/2018/10/09/4403598_20181009234622_small.jpg"),
gevent.spawn(download,"2.jpg","https://rpic.douyucdn.cn/live-cover/appCovers/2018/10/11/5763744_20181011182233_small.jpg"),
gevent.spawn(download,"3.jpg","https://rpic.douyucdn.cn/live-cover/appCovers/2018/12/13/5960450_20181213135411_small.jpg")
])
if __name__ == "__main__":
main()
案例结果示例

