协程是 Python 中实现多任务一种方式, 相比多任务之进程和线程, 协程不需要消耗过多的资源, 更高效的利用了 cpu 资源.
在 Python 中通过 gevent 封装 generator 迭代器功能实现多任务的切换. 协程在运行过程中是靠程序的耗时操作来实现程序中断. 达到切换多任务. 至始至终, 程序都是在一条主线程里面完成的.
下面是一个利用协程实现多张图片的同时下载.
- from gevent import monkey
- import gevent
- import urllib.request
- # 设置识别耗时操作
- monkey.patch_all()
- def my_downLoad(url, file_name):
- try:
- # 根据 url 访问网络资源完成数据读取
- resp = urllib.request.urlopen(url)
- with open(file_name, "wb") as img_file:
- while True:
- # 读取网络图片数据
- file_data= resp.read(4096)
- if file_data:
- # 读取到的数据写入文件
- img_file.write(file_data)
- else:
- break
- except Exception as e:
- print("下载异常:", e)
- else:
- print("图片下载成功:%s" % file_name)
- # 程序入口
- if __name__ == '__main__':
- # 准备下载 url
- url1 = "http://pic1.5442.com/2013/0607/04/11.jpg"
- url2 = "https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=1410462070,509649449&fm=27&gp=0.jpg"
- # 创建协程指派相应的任务
- g1 = gevent.spawn(my_downLoad,url1, "1.jpg")
- g2 = gevent.spawn(my_downLoad,url2, "2.jpg")
- # 主线程等待所有的协程执行完, 程序再退出
- gevent.joinall([g1, g2])
来源: http://www.bubuko.com/infodetail-2554138.html