一、需求分析
1、补充说明:使用协程实现多任务只需要使用gevent实现的方式即可,之前两种(yield和greenlet)仅仅只是原理。
2、要求:使用协程实现图片下载器功能
3、分析:
a、在Python中使用网络功能
b、使用协程实现图片下载器功能:
基本语法:
import urllib.request
请求对象 = urllib.request.urlopen("网址")
c、网络下载的过程是一个延时操作,所以使用协程是最好的办法了。
二、使用协程实现图片下载示例
import urllib.request import gevent from gevent import monkey # 延时补丁 monkey.patch_all() def downloader(img_name, img_url): """图片下载函数 参数1:图片名称 参数2:图片网址 """ # img_url = 'https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1846962141,3948433112&fm=26&gp=0.jpg' req = urllib.request.urlopen(img_url) # 下载图片 img_content = req.read() # 读取图片内容,由于网络原因,程序会卡在这个地方。 with open(img_name, "wb") as f: f.write(img_content) # 将图片内容写入当前目录下 def main(): img_url1 = ' ' img_url2 = ' ' # 使用gevent.joinall将任务加入到列表中, # 参数一:表示任务名,参数二:下载到本地图片保存后名字,参数三:要下载的图片地址 gevent.joinall([ gevent.spawn(downloader, "1.jpg",img_url1), gevent.spawn(downloader, "2.jpg", img_url2) ]) if __name__ == "__main__": main()View Code
运行结果:
在当前目录下创建了两个图片文件,分别是:
1.jpg
2.jpg