目标:使用协程实现网络图片的下载(适合网络io)
多进程:
密集CPU任务,需要充分使用多核CPU资源(服务器,大量的并行计算)的时候,用多进程。
缺陷:多个进程之间通信成本高,切换开销大。
多线程:
密集I/O任务(网络I/O,磁盘I/O,数据库I/O)使用多线程合适。
缺陷:同一个时间切片只能运行一个线程,不能做到高并行,但是可以做到高并发。
协程:
当程序中存在大量不需要CPU的操作时(IO),适用于协程;
import urllib.request
import os
import gevent
from gevent import monkeymonkey.patch_all()# 获取当前工作目录
current_dir = os.getcwd()
# 图片文件夹名称
image_folder_name = "images"
# 构建图片文件夹的完整路径
image_folder_path = os.path.join(current_dir, image_folder_name)
# 如果图片文件夹不存在,创建它
if not os.path.exists(image_folder_path):os.makedirs(image_folder_path)# 文件下载函数
def download_img(imgUrl, file_name):try:# 图片的完整保存路径image_path = os.path.join(image_folder_path, file_name)# 1、根据url地址请求网络资源response_data = urllib.request.urlopen(imgUrl)# 2、在本地创建文件,准备保存with open(image_path, "wb") as file:while True:# 3、读取网络资源数据 (循环)file_data = response_data.read(1024)# 读取数据不为空时再写入if file_data:# 4、把读取的网络资源写入到本地文件中file.write(file_data)else:breakprint(f'图片已保存至:{image_path}')# 5、做异常捕获except Exception as e:print("执行错误!!!")def main():# 1、定义要下载的图片路径img_url1 = "https://science.nasa.gov/wp-content/uploads/2023/09/Tycho-1.jpeg"img_url2 = "https://science.nasa.gov/wp-content/uploads/2023/09/Carina_Nebula-1.jpeg"img_url3 = "https://science.nasa.gov/wp-content/uploads/2023/09/The_Helix_Nebula-1.jpeg"# 2、调用文件下载的函数,专门下载文件# download_img(img_url1, "图片一.jpeg")# download_img(img_url2, "图片二.jpeg")# download_img(img_url3, "图片三.jpeg")g1 = gevent.spawn(download_img, img_url1, "图片一.jpeg")g2 = gevent.spawn(download_img, img_url2, "图片二.jpeg")g3 = gevent.spawn(download_img, img_url3, "图片三.jpeg")gevent.joinall([g1, g2, g3])if __name__ == '__main__':main()