之前用python写了个多线程,但发现四核的电脑,CPU利用率却用了不到30%,
后来使用多进程编程,四核全开,CPU利用率达到了100%!
python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,
在python中大部分情况需要使用多进程。
Python由于全局锁GIL的存在,无法享受多线程带来的性能提升。
multiprocessing包采用子进程的技术避开了GIL,使用multiprocessing可以进行多进程编程提高程序效率。
#coding=utf-8
import multiprocessing
import time
import os
import cv2
import re #查找字符串 re.finditer(word, path)]
import numpy as np
from time import sleep, ctime
iDisPlay=1000 #显示间隔
ithreadNum=6 # 线程数量
#遍历文件夹
list = []
def TraverFolders(rootDir):
for lists in os.listdir(rootDir):
path = os.path.join(rootDir, lists)
list.append(path)
if os.path.isdir(path):
TraverFolders(path)
return list
#可以读取带中文路径的图
def cv_imread(file_path,type=0):
cv_img=cv2.imdecode(np.fromfile(file_path,dtype=np.uint8),-1)
if(type==0):
if(len(cv_img.shape)==3):
cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2GRAY)
return cv_img
#存储图像
def saveImage(list,savePath,threadID):
count = 0 # 文件计数
countImg = 0 # 图片计数
for filename in list[threadID::ithreadNum]:
count += 1
# -----确定子文件夹名称------------------
word = r'\\'
a = [m.start() for m in re.finditer(word, filename)]
if (len(a) == 5): # 字文件夹
strtemp = filename[a[-1] + 1:] # 文件夹名称-字符名称
# print(filename)
# -----确定子文件夹名称------------------
# -----子文件夹图片特征提取--------------
if (len(a) == 6): # 子文件夹下图片
if ('.jpg' in filename):
countImg += 1
if (countImg % iDisPlay == 0):
print("进程%d, 共%d个文件,正在处理第%d张图片..." % (threadID, len(list), countImg))
image = cv_imread(filename, 0)
cv2.imencode('.jpg', image)[1].tofile(savePath + r'\\' + str(threadID)+ '_'+str(countImg)+ '.jpg')
else:
continue
if __name__ == "__main__":
# -------------------------------------------------------------------------------------------------------
time_start = time.time() # 开始计时
path = r"D:\sxl\处理图片\汉字分类\train85" # 文件夹路径
print("遍历图像中,可能需要花一些时间...")
list = TraverFolders(path)
savePath = r"D:\python多线程"
# 创建进程
Process=[]
print("创建进程...")
for i in range(ithreadNum):
p = multiprocessing.Process(target = saveImage, args = (list, savePath, i))
Process.append(p)
# 启动进程
print("启动进程...")
for i in range(ithreadNum):
Process[i].start()
for i in range(ithreadNum):
Process[i].join()
print("The number of CPU is:" + str(multiprocessing.cpu_count()))
for p in multiprocessing.active_children():
print("child p.name:" + p.name + "\tp.id" + str(p.pid))
print ("END!!!!!!!!!!!!!!!!!")
time_end=time.time()
time_h=(time_end-time_start)/3600
print('用时:%.6f 小时'% time_h)