可能是由于刚接触python,其函数参数传递跟C++有非常大的不同,花了很多的时间
还是按照惯例,先贴源码,但是在此之前先说明,多线程共享对象目前发现只能通过dict进行,发现list等其他类型并不起到引用传递的作用。
# -*- coding: cp936 -*- import cv2 import sys import multiprocessing import time import os import numpy as np class imgA: def __init__(self): print 'init:',os.getpid() self.a=[] self.b=[] self.c=[] self.all=[] self.radius = multiprocessing.Manager().dict() self.radius['a'] = self.a self.radius['b']=self.b self.radius['c']=self.c self.radius['all']=self.all def add(self): for i in range(self.a.shape[0]): for j in range(self.a.shape[1]): if(self.a[i][j])>0: self.a[i][j]=0 else: self.a[i][j]=255 self.radius['a']=self.a def add2(self): for i in range(self.b.shape[0]): for j in range(self.b.shape[1]): if(self.b[i][j])>0: self.b[i][j]=0 else: self.b[i][j]=255 self.radius['b']=self.b #需要更新 def add3(self): for i in range(self.all.shape[0]): for j in range(self.all.shape[1]): if(self.all[i][j])>0: self.all[i][j]=0 else: self.all[i][j]=255 self.radius['all']=self.all #需要更新 def read(self): self.all=cv2.imread('E:\\41.bmp',0) imgsize=self.all.shape[0] self.a = (self.all)[0:imgsize/2] self.b = (self.all)[imgsize/2:imgsize] self.radius['a'] = self.a self.radius['b']=self.b self.radius['all']=self.all if __name__ == '__main__': t_ctime=time.clock() aa = imgA() aa.read() print 'start' process1 = multiprocessing.Process(target=aa.add, args=()) process2 = multiprocessing.Process(target=aa.add2, args=()) process1.daemon = True process2.daemon = True process1.start() process2.start() process1.join() process2.join() print 'done' gg=np.concatenate((aa.radius['a'],aa.radius['b'])) t_ctime=(time.clock()-t_ctime)*1000 print t_ctime,'ms' cv2.imshow('gg',gg) cv2.imshow('a',aa.radius['a']) cv2.imshow('b',aa.radius['b']) cv2.imshow('all',aa.radius['all']) # print aa.radius,os.getpid() cv2.waitKey(0) 可以看到,每次操作我们并不直接操作共享对象,而是操作类中的,相当于其备份,等操作完成后再进行覆盖,目前测试只发现这种方式可行。不使用类的形式,采用函数是绝对行不通的。
以上的代码总体思想是,将读取的图像进行分块,然后建立相应的进程(核心数决定),最后再组合在一起。经测试,多开一个进程效率提高大约在30%以上。如果有错误请联系QQ:498235584!万分感谢