python中的线程并行

news2024/11/18 11:48:17

文章目录

  • 1. 单线程
  • 2. 线程池ThreadPoolExecutor

1. 单线程

现在有1154张图片需要顺时针旋转后保存到本地,一般使用循环1154次处理,具体代码如下所示,img_paths中存储1154个图片路径,该代码段耗时约用97ms。

t1=time.time()
for imgpath in img_paths:
    img=cv2.imread(imgpath,0)
    img=cv2.rotate(img,cv2.ROTATE_90_CLOCKWISE)

    info=imgpath.split("/")
    parent,filename=info[-2],info[-1]
    filename=parent+"_"+filename.split(".")[0].zfill(5)+".jpg"
    dst_save_path=os.path.dirname(imgpath).replace(f"{sub}","result/")+filename
    cv2.imwrite(dst_save_path,img)
t2=time.time()
print(t2-t1)

可以看到CPU运行状态,只有一个在运行:
在这里插入图片描述

2. 线程池ThreadPoolExecutor

对于这种没有数据交换的任务,可以使用多线程。python中有很多多线程、多进程的库,这里试试线程池ThreadPoolExecutor。
这个库核心有两个:

  • with ThreadPoolExecutor(max_workers=batch_size) as executor:创建一个上下文管理的执行器,并制定线程池中线程个数;
  • executor.map(process_image, batch):process_image是执行的函数,接受一个路径,batch是储存多个路径的列表,大小等于小于执行器的max_workers。这个方法会为batch中的每个图像路径启动一个线程(最多同时运行max_workers数量的线程),并在每个线程中调用之前定义的process_image函数处理对应的图像。map方法会等待所有线程完成后再继续下一轮循环,确保每个批次内的图像处理是并行且同步完成的。

下方的代码耗时约37ms

import cv2
import os
from concurrent.futures import ThreadPoolExecutor

def process_image(imgpath):
    # 读取并旋转图像
    img = cv2.imread(imgpath, 0)
    img = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)

    # 分割路径以获取父目录和文件名
    info = imgpath.split("/")
    parent, filename = info[-2], info[-1]
    
    # 重命名文件
    base_name = filename.split(".")[0]
    new_filename = f"{parent}_{base_name.zfill(5)}.jpg"
    
    # 构建保存路径
    dst_save_path = os.path.dirname(imgpath).replace("sub", "result/") + new_filename
    
    # 保存处理后的图像
    cv2.imwrite(dst_save_path, img)

def batch_process_images(img_paths, batch_size=15):
    with ThreadPoolExecutor(max_workers=batch_size) as executor:
        for i in range(0, len(img_paths), batch_size):
            # 每次处理batch_size个图像路径
            batch = img_paths[i:i+batch_size]
            executor.map(process_image, batch)

# 假设img_paths是包含所有图像路径的列表
img_paths = [...]  # 这里填充实际的图像路径列表
batch_process_images(img_paths)

可以看到,15个cpu都被调用起来了
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1692377.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud系列(30)--准备使用Hystrix的前期工作,创建服务消费者模块

前言:在上一章节中我们创建了服务提供者模块,而本节内容则是创建服务消费者模块。 1、创建一个服务提供者模块,命名为cloud-consumer-feign-hystrix-order80 (1)在父工程下新建模块 (2)选择模块的项目类型为Maven并选择模块要使用的JDK版本 …

面向Prompt编程

Prompt 就像和一个人对话,你说一句,ta 回一句,你再说一句,ta 再回一句…… Prompt 就是你发给大模型的指令,比如「讲个笑话」、「用 Python 编个贪吃蛇游戏」、「给男/女朋友写封情书」等 貌似简单,但意义…

vue项目实战 - 如果高效的实现防抖和节流

在Vue项目中,处理高频事件的优化至关重要,直接影响用户体验和应用性能。防抖(Debounce)和节流(Throttle)是两种常用且有效的方法,可以控制事件触发频率,减少不必要的资源消耗。如何在…

labview_开放协议

一、开放协议 二、硬件设置 英格索兰硬件设置: 三、配套测试软件 四、Labview代码

科技赋能,打破视障人士的沟通壁垒

在探索如何增强盲人群体的社会参与度与幸福感的旅程中,盲人社交能力提升策略成为了不容忽视的一环。随着科技的不断进步,像“蝙蝠避障”这样的辅助软件,不仅在日常出行中为盲人提供了实时避障和拍照识别的便利,也在无形中为他们拓…

SQL面试题练习 —— 波峰波谷

来源:字节今日头条 目录 1 题目2 建表语句3 题解 1 题目 有如下数据,记录每天每只股票的收盘价格,请查出每只股票的波峰和波谷的日期和价格; 波峰定义:股票价格高于前一天和后一天价格时为波峰 波谷定义:股…

FPGA状态机设计详解

一.什么是状态机? 想象一下你正在玩一个电子游戏,角色有多种状态,比如“行走”、“跳跃”、“攻击”等。每当你按下不同的按键或者满足某些条件时,角色的状态就会改变,并执行与该状态对应的动作。这就是状态机的一个简…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-23.3,4,5,6 讲 I2C驱动-读取AP3216C传感器​

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

计算机SCI期刊,IF=8+,专业性强,潜力新刊!

一、期刊名称 Journal of Big data 二、期刊简介概况 期刊类型:SCI 学科领域:计算机科学 影响因子:8.1 中科院分区:2区 出版方式:开放出版 版面费:$1990 三、期刊征稿范围 《大数据杂志》发表了关于…

HLS视频加密,让您的视频内容更安全!

背景介绍 HLS视频加密是一种基于HTTP Live Streaming(HLS)协议的加密技术。它的核心思想是将视频切片进行加密处理,在客户端播放时需要先获取解密密钥才能正常偶发。通过这种方式,HLS加密可以有效防止未经授权的第三方窃取视频内…

刷题篇--数据结构--链表

一.环形链表Ⅰ . - 力扣(LeetCode) 这道题可以利用快慢指针的方法来解决,即定义一个快指针f他的速度是一次走两步,慢指针s他的速度是一次走一步,这时我们假设链表有环,环的入口点为N,当两个指…

27寸2K显示器 - HKC G27H2

HKC G27H2是一款面向电竞市场的高性能显示器,以其2K分辨率和180Hz的刷新率作为主要卖点,旨在为玩家提供流畅而清晰的视觉体验。配备HDR 400技术和95% DCI-P3色域覆盖,这款显示器还支持升降旋转支架,为用户提供了高度的人体工程学适…

同旺科技 FLUKE ADPT 隔离版发布 ---- 说明书

所需设备: 1、FLUKE ADPT 隔离版 内附链接; 应用于:福禄克Fluke 12E / 15BMax / 17B Max / 101 / 106 / 107 应用于:福禄克Fluke 15B / 17B / 18B

酷开科技大屏营销,多元需求唤醒“客厅经济”

随着科技的发展和消费者习惯的变化,OTT大屏营销正逐渐成为客厅经济的新风向。OTT不仅改变了人们获取信息和娱乐的方式,也为品牌营销提供了新的机遇和挑战,OTT大屏营销已经成为客厅经济的重要组成部分。酷开科技通过其自主研发的智能电视操作系…

戴尔(Dell)服务器运行状况监控

戴尔(Dell)服务器因其加速的性能、增强的自动化和简化的管理而受到全球许多组织的青睐,许多组织将其业务关键应用程序和功能放在戴尔(Dell)服务器中,因此,有效的戴尔(Dell&#xff0…

Jeecg | 完成配置后,如何启动整个项目?

前端启动步骤: 1. 以管理员身份打开控制台,切换到前端项目目录。 2. 输入 pnpm install 3. 输入 pnpm dev 4. 等待前端成功运行。 可以看到此时前端已经成功启动。 后端启动步骤: 1. 启动 mysql 服务器。 管理员身份打开控制台&#…

基于51单片机的多功能万年历温度计—可显示农历

基于51单片机的万年历温度计 (仿真+程序+原理图+设计报告) 功能介绍 具体功能: 本设计基于STC89C52(与AT89S52、AT89C52通用,可任选)单片机以及DS1302时钟芯片、DS18B…

Spring6 对 集成MyBatis 开发运用(附有详细的操作步骤)

详细实现操作步骤 具体实现内容:我们运用 Spring6 和 MyBatis 实现一个转账操作(该转账操作,进行一个事务上的控制,运用 MyBatis 执行 SQL 语句)。 第一步:准备数据库表 使用t_act表(账户表) 连接数据库的…

Scrapy框架简单介绍及Scrapy项目编写详细步骤

引言 Scrapy是一个用Python编写的开源、功能强大的网络爬虫框架,专为网页抓取和数据提取设计。它允许开发者高效地从网站上抓取所需的数据,并通过一系列可扩展和可配置的组件来处理这些数据。Scrapy框架的核心组成部分包括: Scrapy Engine&…

实在智能Agent保障已就位,助力商家从容应对618大促挑战

618购物狂欢节第一波“年中开门红”已开启,商家纷纷进入战斗状态,力求在这场消费盛宴中脱颖而出。面对消费者高涨的购买热情和激烈的市场竞争,如何在确保服务质量的同时,提升运营效率,成为每个商家必须面对的挑战。 为…