Python多进程

之前用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)

欢迎扫码关注我的微信公众号

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值