线程与进程的理解

进程:是执行中一段程序,即一旦程序被载入到内存中并准备执行,它就是一个进程。进程是表示资源分配的的基本概念,又是调度运行的基本单位,是系统中的并发执行的单位.
线程:是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)相关推荐

  1. 【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 ...

  2. 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 ...

  3. 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 脏数 ...

  4. c++ map用法_Pandas数据处理三板斧——map、apply、applymap详解

    在日常的数据处理中,经常会对一个DataFrame进行逐行.逐列和逐元素的操作,对应这些操作,Pandas中的map.apply和applymap可以解决绝大部分这样的数据处理需求.这篇文章就以案例附 ...

  5. dataframe groupby_详解pandas中的map、apply、applymap、groupby、agg.

    一.简介 pandas提供了很多方便简洁的方法,用于对单列.多列数据进行批量运算或分组聚合运算,熟悉这些方法后可极大地提升数据分析的效率,也会使得你的代码更加地优雅简洁. 本文就将针对pandas中的 ...

  6. Pandas教程 | 数据处理三板斧——map、apply、applymap详解

    公众号:Python读财 如有问题或建议,请公众号留言 在日常的数据处理中,经常会对一个DataFrame进行逐行.逐列和逐元素的操作,对应这些操作,Pandas中的map.apply和applyma ...

  7. Pandas数据分析——超好用的Groupby与map、apply、applymap详解

    Groupby详解 在日常的数据分析中,经常需要将数据根据某个(多个)字段划分为不同的群体(group)进行分析,如电商领域将全国的总销售额根据省份进行划分,分析各省销售额的变化情况,社交领域将用户根 ...

  8. python多进程map比apply快_python 多进程读写 map

    要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识. Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函数调用,调用一次,返回 ...

  9. python多进程中apply和apply_async用法详解

    python在同一个线程中多次执行同一方法时,假设该方法执行耗时较长且每次执行过程及结果互不影响,如果只在主进程中执行,效率会很低,因此使用multiprocessing.Pool(processes ...

  10. filter,map,reduce,apply函数

    (1)lambda     lambda是Python中一个很有用的语法,它允许你快速定义单行最小函数.类似于C语言中的宏,可以用在任何需要函数的地方. 基本语法如下: 函数名 = lambda ar ...

最新文章

  1. golang xml和json的解析与生成
  2. loadrunner中自定义查找并替换函数
  3. Linux下安装MongoDB单节点
  4. Python偷懒小技巧-提高10倍工作效率
  5. ue4集合类型_UE4-Sockets
  6. vc6项目-vc8项目 转换日志
  7. 地图上制作线路的动画_R制作动画地图
  8. Senparc.Weixin 授权获取微信信息
  9. linux制作win7启动u盘
  10. windows cmd修改ip地址
  11. 化工行业ERP管理系统丨外贸软件
  12. 衣服的尺寸S、M、L、XL、XXL分别表示的型号大小顺序是什么?
  13. 透明度轮播图和滚动轮播图
  14. Zookeeper之Curator分布式锁简单模拟12306抢票
  15. ISTQB基础级认证参考书
  16. 20200213ubuntu20.04下的笔记本USB摄像头的相关资料
  17. JAVA数组 添加数组元素并排序---下标越界问题
  18. “Cache-主存”和“主存和辅存”的区别
  19. 《周易》六十四卦歌诀
  20. matplotlib (一) 图的基本操作

热门文章

  1. 自动驾驶技术基础——惯导
  2. 匠心独运解读Mybatis源码,纯手工打造开源框架
  3. 图像算法---白平衡AWB(讲的很好)
  4. C/C++_随机生成0-1之间的数
  5. 12c 新特性-统一审计(Unified Auditing)
  6. Excel换行显示的几种方法,你知道吗?
  7. 提升计算机科学素养,中职学生计算机科学与技术专业素养提升策略
  8. 用Python来合并图片(SoEasy)
  9. android深入浅出binder机制,Android Binder机制,跨进程机制深入理解精华总结
  10. AI 成野生动物保护神:没有图像识别算法,考拉可能灭绝!