python多进程使用

news/2024/11/30 0:32:00/

目录

    • 背景
    • 单个输入参数
    • 多个输入参数

背景

在工作或者生活中,可能会遇到大量的for循环处理逻辑,这些逻辑完全可以并行(比如读取一个文件夹中的所有图片,然后将其resiz到最长边不超过960),此时我们可以使用多进程的方法,并行处理这些逻辑,从而大幅降低程序运行时间。

我们使用官方的multiprocessing库就可以完成这些操作。下面直接给出具体示例。

单个输入参数

下面是单进程和多进程的演示demo,将process_num参数修改为8,即表示进程数为8去处理。

import time
import cv2
import os
import numpy as np
from multiprocessing import Pooldef resize(img_path):# 这里使用假数据进行测试if not os.path.exists(img_path):img = np.zeros([1920, 1080, 3]).astype(np.uint8)else:img = cv2.imread(img)new_img = cv2.resize(img, [320, 480])return new_imgdef test_mp_resize():img_paths = ["fake_path"] * 10000start_time = time.time()process_num = 1with Pool(process_num) as pool:res = pool.map(resize, img_paths)cost_time = time.time() - start_timeprint(f"process num: {process_num}, cost time: {cost_time} s")if __name__ == "__main__":test_mp_resize()

不同进程数下的耗时对比如下。可以看出多进程在速度方面还是有优势的,不过受到我自己的机器CPU kernel数以及传参的影响,这里并没有线性的加速的效果。

(py38) ➜  mp_demo python test_mp.py
process num: 1, cost time: 52.58454394340515 s
(py38) ➜  mp_demo python test_mp.py
process num: 2, cost time: 39.837116956710815 s
(py38) ➜  mp_demo python test_mp.py
process num: 4, cost time: 36.69755434989929 s
(py38) ➜  mp_demo python test_mp.py
process num: 8, cost time: 34.3617799282074 s

多个输入参数

下面的代码展示了怎么对于多个输入传参的情况使用多进程。步骤有:

  1. 使用zip构建参数列表,见下面test_mp_resize函数的input_args生成过程。
  2. 新建一个函数,用于参数解析与传递,见下面的resize_one_input,他的作用就是将一个输出列表转化为多输入*args的形式。
  3. 使用多进程。
import time
import cv2
import os
import numpy as np
from multiprocessing import Pooldef resize(img_path, shape):# 这里使用假数据进行测试if not os.path.exists(img_path):img = np.zeros([1920, 1080, 3]).astype(np.uint8)else:img = cv2.imread(img)new_img = cv2.resize(img, shape)return new_imgdef resize_one_input(inputs):return resize(*inputs)def test_mp_resize():img_paths = ["fake_path"] * 10000shapes = [[320, 480]] * len(img_paths)input_args = zip(img_paths, shapes)start_time = time.time()process_num = 2with Pool(process_num) as pool:res = pool.map(resize_one_input, input_args)cost_time = time.time() - start_timeprint(f"process num: {process_num}, cost time: {cost_time} s")if __name__ == "__main__":test_mp_resize()

http://www.ppmy.cn/news/512028.html

相关文章

前端3D Three.js 在本地搭建一个官方网站

上文Web前端 3D开发入门规划 3D效果将不再是桌面应用的专利我们说了说 WEB 3D的一个发展和学习方向 那么 我们还是先搞定文档使用的问题 我们可以访问http://www.yanhuangxueyuan.com/Three.js/这里面可以查到使用方法 但不是最新的 而是别人用官方文档改的 真正的官方文档地址…

黑客都用什么牌子的电脑?

【黑客联盟2017年06月05日讯】你知不知道,全世界的黑客都凑在一间屋子里,是一种怎样的体验? 朋友:神马?有这种事?屋子里有床吗? 你:是全世界的黑客,不是全日本的演员。。…

推荐这几款好用的电脑软件

软件一:Sticky Notes Sticky Notes(便笺)是Windows系统自带的便签应用程序,它可以帮助用户快速创建、编辑、保存和查看文本便笺。用户可以在便笺上记录备忘、灵感、待办事项等内容,方便日常生活和工作中的信息管理。 …

推荐7 款实用好用的电脑软件

EasyCharts EasyCharts 是一个简单好用 的Excel 插件。 使用它可以快速制作出美观高大上的图表。 它支持多种图表,什么柱线图,散列图,折线图等等。而且还能美化配色图表。 它还可以使用数据分析命令自动绘制复杂的图表。 关注…

好用的电脑软件

好用的软件 1.装机必备 1)火绒安全中心 这里我推荐火绒的原因很简单,就是没有广告,还能给你屏蔽广告和弹窗。 火绒官网 2)火狐浏览器 没有广告的浏览器 火狐官网 3)BindiZip 高效快捷的解压软件,之…

底盘线控悬架智能化趋势

摘要: 汽车的底盘主要由行驶系、传动系、转向系和制动系四部分组成,其中行驶系又由汽车的车架、车桥、车轮和悬架等系统组成。底盘的悬架系统不仅是汽车重要的组成部分,而且还关乎到一辆汽车在行驶过程中的质感,影响车辆的操控性…

从零开始 Spring Boot 46:@Lookup

从零开始 Spring Boot 46:Lookup 图源:简书 (jianshu.com) 在前文中,我介绍了 Spring Bean 的作用域(Scope),且讨论了将一个短生命周期的 bean (比如request作用域的 bean)注入到长…

Session覆盖测试-业务安全测试实操(19)

弱Token设计缺陷测试,Session覆盖测试 Session覆盖测试 测试原理和方法 找回密码逻辑漏洞测试中也会遇到参数不可控的情况,比如要修改的用户名或者绑定的手机号无法在提交参数时修改,服务端通过读取当前session会话来判断要修改密码的账号,这种情况下能否对Session中的内容做…