multiprocessing.Pool(pool.map pool.apply pool.apply_async poo.map_async)
线程与进程的理解
进程:是执行中一段程序,即一旦程序被载入到内存中并准备执行,它就是一个进程。进程是表示资源分配的的基本概念,又是调度运行的基本单位,是系统中的并发执行的单位.
线程:是cpu调度最小单位,单个进程中执行中每个任务就是一个线程。线程也是进程中执行运算的最小单位。
而对于python的多线程与多进程的理解可以参考链接文章→python的多线程与多进程
python多线程由于GIL锁(全局解释器锁)的存在,python程序只能在一个处理器上运行,无法真正的实现多线程执行任务。所以接下来重点介绍多进程。
多进程multiprocessing.Pool
进程池Pool 提供的功能有嗲类似于列表和函数式编程操作(映射-归约)提供的功能。
Pool(procesess) 创建工作进程池,process为要创建的进程数,如果省略此参数,将使用cpu_count()值。
Pool.apply(func,(args,(kwargs))) 在一个进程池中执行函数func(*args,**kwargs),然后返回结果。此操作不会在所有池工作进程中并行执行func函数。如果要使用不同参数并发执行func函数,必须从不同的线程调研Pool.appy()函数或者使用Pool.appy_async()函数。
Pool.apply_async(func,(args,(kwargs))) 在一个进程池中异步执行函数func(*args,**kwargs),然后返回AsyncResult类的实例的结果,可以用get()函数获得最终计算结果。
Pool.map(func,iterable) 将可调用对象func应用给iterable中的所有项,然后以列表的形式返回结果。通过将iterable划分为多块并将工作分派给工作进程执行这项操作。Pool.map_async(func,iterable) 同map函数,但结果返回的是异步的,且返回值是AsyncResult类的实例,需要用get()函数去获得最终结果。
下面用一张图来对比一下
一些简单代码例子可以参考这篇文章加以理解:python进程池:multiprocessing.pool
下面贴出我在图像分类项目做图像增强以及多进程加载数据的code:
class Dataloader():def __init__(self, file_path, img_shape=(224, 224)):# 获取到了数据条数self.f_lines = open(file_path).readlines()# 定义了label编号self.labelDict = {。。。} # 获取到数据量大小self.dataNum = len(self.f_lines)# 获取到label个数self.labelNum = len(self.labelDict)self.img_shape = img_shape@classmethoddef get_random_data(self, content, img_shape, labelDict, labelNum, is_training):def add_noise(image, percentage):noise_image = image.copy()im_w = image.shape[1]im_h = image.shape[0]noise_num = int(percentage * im_w * im_h)for i in range(noise_num):temp_x = np.random.randint(0, image.shape[1])temp_y = np.random.randint(0, image.shape[0])noise_image[temp_y][temp_x][np.random.randint(3)] = np.random.randn(1)[0]return noise_imagedef rotate(image):(h, w) = image.shape[:2]center = (w / 2, h / 2)angle = (np.random.random() - 0.5) * 20M = cv2.getRotationMatrix2D(center, angle, 1)image = cv2.warpAffine(image, M, (w, h))return imagedef crop(image):img_w = image.shape[1]img_h = image.shape[0]h = np.random.randint(30, 50)w = np.random.randint(30, 50)image = image[h:h + img_h, w:w + img_w, :]return image# 数据格式 imgPath,labelimgPath, label = content.strip().split(",")image = cv2.imread(imgPath)image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)if is_training:aug_num = np.random.randint(low=0, high=4)aug_queue = np.random.permutation(4)[0:aug_num]for idx in aug_queue:if idx == 0:image = np.fliplr(image)elif idx == 1:image = crop(image)elif idx == 2:image = add_noise(image, 0.25)elif idx == 3:image = rotate(image)image = (image - 127)*0.0078125image = cv2.resize(image, img_shape)label_index = labelDict[label]label = np.zeros(labelNum)label[label_index] = 1 # [1,0,0,.....]return image, labeldef load_batch(self, batch_size, is_training=True):"""用于加载数据,batch_size为训练批次图像数目,is_training为是否训练标志"""# 计算一个epoch的batch次数batchNum = len(self.f_lines) // batch_sizewhile True:with multiprocessing.Pool(processes=8) as pool:# 每个epoch之前做一次数据扰乱random.shuffle(self.f_lines)for i in range(batchNum):# 是一个batch的内容trainContent = self.f_lines[i * batch_size:(i + 1) * batch_size]out = []tmp = []for content in trainContent:tmp.append(pool.apply_async(self.get_random_data, (content, self.img_shape,self.labelDict, self.labelNum, is_training)))for tmp_ in tmp:out.append(tmp_.get())imgs = list(zip(*out))[0]labels = list(zip(*out))[1]yield np.array(imgs), np.array(labels)
multiprocessing.Pool(pool.map pool.apply pool.apply_async poo.map_async)相关推荐
- 【Python】Python进程池multiprocessing.Pool八个函数对比:apply、apply_async、map、map_async、imap、starmap...
1.apply 和 apply_async 一次执行一个任务,但 apply_async 可以异步执行,因而也可以实现并发. 2.map 和 map_async 与 apply 和 apply_asy ...
- PHP error:ERROR: No pool defined. at least one pool section must be specified in config file
如题所示的报错发生在php-fpm启动的过程中,具体如下: [root@linuxme php-7.0.9]# pwd /usr/local/php-7.0.9 [root@linuxme php-7 ...
- 14.4.3.5 Configuring InnoDB Buffer Pool Flushing 配置InnoDB Buffer Pool 刷新:
14.4.3.5 Configuring InnoDB Buffer Pool Flushing 配置InnoDB Buffer Pool 刷新:InnoDB执行某些任务在后台, 包括flush 脏数 ...
- c++ map用法_Pandas数据处理三板斧——map、apply、applymap详解
在日常的数据处理中,经常会对一个DataFrame进行逐行.逐列和逐元素的操作,对应这些操作,Pandas中的map.apply和applymap可以解决绝大部分这样的数据处理需求.这篇文章就以案例附 ...
- dataframe groupby_详解pandas中的map、apply、applymap、groupby、agg.
一.简介 pandas提供了很多方便简洁的方法,用于对单列.多列数据进行批量运算或分组聚合运算,熟悉这些方法后可极大地提升数据分析的效率,也会使得你的代码更加地优雅简洁. 本文就将针对pandas中的 ...
- Pandas教程 | 数据处理三板斧——map、apply、applymap详解
公众号:Python读财 如有问题或建议,请公众号留言 在日常的数据处理中,经常会对一个DataFrame进行逐行.逐列和逐元素的操作,对应这些操作,Pandas中的map.apply和applyma ...
- Pandas数据分析——超好用的Groupby与map、apply、applymap详解
Groupby详解 在日常的数据分析中,经常需要将数据根据某个(多个)字段划分为不同的群体(group)进行分析,如电商领域将全国的总销售额根据省份进行划分,分析各省销售额的变化情况,社交领域将用户根 ...
- python多进程map比apply快_python 多进程读写 map
要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识. Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函数调用,调用一次,返回 ...
- python多进程中apply和apply_async用法详解
python在同一个线程中多次执行同一方法时,假设该方法执行耗时较长且每次执行过程及结果互不影响,如果只在主进程中执行,效率会很低,因此使用multiprocessing.Pool(processes ...
- filter,map,reduce,apply函数
(1)lambda lambda是Python中一个很有用的语法,它允许你快速定义单行最小函数.类似于C语言中的宏,可以用在任何需要函数的地方. 基本语法如下: 函数名 = lambda ar ...
最新文章
- golang xml和json的解析与生成
- loadrunner中自定义查找并替换函数
- Linux下安装MongoDB单节点
- Python偷懒小技巧-提高10倍工作效率
- ue4集合类型_UE4-Sockets
- vc6项目-vc8项目 转换日志
- 地图上制作线路的动画_R制作动画地图
- Senparc.Weixin 授权获取微信信息
- linux制作win7启动u盘
- windows cmd修改ip地址
- 化工行业ERP管理系统丨外贸软件
- 衣服的尺寸S、M、L、XL、XXL分别表示的型号大小顺序是什么?
- 透明度轮播图和滚动轮播图
- Zookeeper之Curator分布式锁简单模拟12306抢票
- ISTQB基础级认证参考书
- 20200213ubuntu20.04下的笔记本USB摄像头的相关资料
- JAVA数组 添加数组元素并排序---下标越界问题
- “Cache-主存”和“主存和辅存”的区别
- 《周易》六十四卦歌诀
- matplotlib (一) 图的基本操作