python中的線程并行

文章目錄

  • 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/")+filenamecv2.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 ThreadPoolExecutordef 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.pswp.cn/web/14913.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14913.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14913.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python筑基之旅-MySQL數據庫(四)

目錄 一、數據表操作 1、新增記錄 1-1、用mysql-connector-python庫 1-2、用PyMySQL庫 1-3、用PeeWee庫 1-4、用SQLAlchemy庫 2、刪除記錄 2-1、用mysql-connector-python庫 2-2、用PyMySQL庫 2-3、用PeeWee庫 2-4、用SQLAlchemy庫 3、修改記錄 3-1、用mysql-conn…

Java輕松轉換Markdown文件到Word和PDF文檔

Markdown 憑借其簡潔易用的特性,成為創建和編輯純文本文檔的常用選擇。但某些時候我們需要更加精致的展示效果,例如在專業分享文檔或打印成離線使用的紙質版時,就需要將Markdown文件以其他固定的文檔格式呈現。通過將 Markdown 轉換為 Word 和…

OpenHarmony實戰開發——網絡組件axios可以在OpenHarmony上使用了

什么是axios 上古瀏覽器頁面在向服務器請求數據時,因為返回的是整個頁面的數據,頁面都會強制刷新一下,這對于用戶來講并不是很友好。并且我們只是需要修改頁面的部分數據,但是從服務器端發送的卻是整個頁面的數據,十分…

高效寫代碼java-推薦插件1(格式轉化 ConverterX )-日后待更新

ConverterX 主要功能:格式轉化 字符串格式轉換 日期轉換 Json格式轉義 字符格式 快捷鍵 ctrl shiftS Upper(CODEEASE)字符串全部變成大寫Lower(codeease)字符串全部變成小寫Camel(codeEase)字符串變成小駝峰ClassCaemel(CodeEase)字符串變成大駝峰UnderlineUpper(CODE_EAS…

項目管理:Jira,禪道,GitHub Issues對比

Jira、禪道(ZenTao)和GitHub Issues都是項目管理工具,但它們在功能、適用場景和特性上有所不同。以下是它們之間的對比: 功能: Jira:是一款強大的項目管理工具,適用于各種項目,尤其…

Vue3組件間通信通過回調函數傳遞數據

Vue3組件間通信通過回調函數傳遞數據 一、前言1、使用場景2、實現方法1. 父組件中定義回調方法2. 子組件中觸發回調方法 二、結論 一、前言 在 Vue 3 中,組件之間的通信是一個重要的主題。在許多情況下,你可能需要從子組件向父組件傳遞數據或觸發父組件…

python實用系列:按順序重命名文件

啊,好久沒更博客了,今天偶然想換個桌面壁紙,于是上網搜了兩個比較滿意的桌面壁紙,都是壓縮包: 當我想要給他們放到我的桌面壁紙文件里的時候患了難,因為他們的名字有相同的: anime文件夾里邊&a…

揭秘!亞馬遜、Vinted賣家如何借助自養號測評實現爆單?

?作為一名跨境賣家,你一定夢想著能夠在亞馬遜上實現爆單,讓產品火爆銷售。下面就分享五個秘訣,幫助你實現這個夢想: 1. 優質產品:首先,確保你的產品質量優秀,能夠滿足消費者的需求。品質好的產…

基于Matlab使用BP神經網絡進行電力系統短期負荷預測

歡迎大家點贊、收藏、關注、評論啦 ,由于篇幅有限,只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景與意義 電力系統的短期負荷預測對于電力調度和能源管理具有至關重要的作用。通過準確地預測電力負荷&…

【產品經理】輸出

引言: ? ? ? ?在最近頻繁的產品管理職位面試中,我深刻體會到了作為產品經理需要的不僅僅是對市場和技術的敏銳洞察,更多的是在復雜多變的環境中,如何運用溝通、領導力和決策能力來引導產品從概念走向市場。這一系列博客將分享…

CAN網絡管理(TJA1145如何實現MCU的休眠喚醒)

節點喚醒方式 本地喚醒: 喚醒源來源于自身模塊,比如常說的KL15,控制器由KL15線供電,即只能在鑰匙置于“ACC”或者“ON”檔時運行軟件和維持CAN通信 對于正在運行的CPU軟件,無論它處在什么狀態,只要Hardwa…

深度學習模型keras第二十五講:使用KerasNLP從零開始預訓練Transformer模型

1、KerasNPL預訓練Transformer模型概念 使用KerasNLP來預訓練一個Transformer模型涉及多個步驟。由于Keras本身并不直接提供NLP的預訓練模型或工具集,我們通常需要結合像TensorFlow Hub、Hugging Face的Transformers庫或自定義的Keras層來實現。 以下是一個簡化的…

Android Baidu地圖SDK只展示藍背景,沒有繪制內容問題解決

背景 項目里接入了Baidu地圖SDK,用于展示信息、選點。 在一個新的Activity中,引入了TextureMapView,用于地圖展示。 選點過程有兩個頁面。 A頁面中有一個不能滑動的地圖,只是用來展示,沒有其他任何操作。 點擊A頁…

Plesk中如何移除之前添加的域名

我這邊想要移除我之前綁定到主機的域名,但是不知道如何在主機上面進行移除,由于我使用的Hostease的Windows虛擬主機產品默認帶普通用戶權限的Plesk面板,但是不知道如何在Plesk上操作移除域名,因為也是對于Hostease主機產品不是很了…

java單元測試:JUnit斷言庫

JUnit斷言庫提供了一組用于驗證測試結果的工具。這些斷言方法幫助開發人員在單元測試中明確表達預期結果,并在實際結果與預期結果不符時報告失敗。 1. JUnit中的斷言 斷言用于驗證測試的預期結果。JUnit 5(Jupiter)提供了一組靜態方法&…

獲取和設置代理的動態IP的方式

引言 大家好,今天我來給大家分享一下如何通過編程技術來獲取和設置代理的動態IP。在網絡世界中,代理和動態IP是非常常見的概念,尤其對于需要大規模訪問網站或者需要隱藏真實IP地址的應用程序來說,更是必不可少的工具。接下來&…

【精品】【算法實戰】每日一題:如何用Python實現給定整數序列中尋找最小長度窗口以包含所有不同元素的算法?

問題: 如何用Python實現給定整數序列中尋找最小長度窗口以包含所有不同元素的算法? 核心思路 核心思路是利用雙端隊列(作為滑動窗口)來找到一個滿足特定條件的最小長度子序列。算法遍歷給定的序列,對于每個新數據點…

【Spring】Spring框架對RESTFul風格的支持

1、簡介 Spring框架對RESTful風格的支持主要體現在Spring MVC和Spring Boot等模塊中。RESTful(Representational State Transfer,表述層資源狀態轉移)是一種軟件架構風格,它強調資源(通常是網絡上的信息)的…

Java方法的基本用法

Java方法的基本用法 前言一、什么是方法方法存在的意義示例 二、方法定義語法基本語法代碼示例注意事項 三、方法調用的執行過程基本規則代碼示例計算兩個整數相加計算 1! 2! 3! 4! 5! 四、實參和形參的關系代碼示例交換兩個整型變量原因分析解決辦法 五、沒有返回值的方法…

初識java——javaSE (6)接口的實現——比較器與深拷貝,淺拷貝

文章目錄 前言一 比較器1.1 關于兩個對象的比較1.2 Comparable接口:1.3 Arrays.sort方法的實現1.4 比較器的實現Comparator接口 二 深拷貝與淺拷貝2.1 淺拷貝:Cloneable接口:clone方法:實現拷貝:淺拷貝: 2.…