Python-多进程改进超过了cpu.count()的值

Python-多进程改进超过了cpu.count()的值,python,multiprocessing,Python,Multiprocessing,我实现了一个多进程脚本来改进图像分析。它工作得很好,目前我试图根据时间定义最佳数量的进程。 正如我在增加进程和减少时间时所体验到的,但这种情况也超出了cpu.count()的值。所以我不明白,我以为在这之后,我的时间又增加了……有什么解释吗 我的一段代码: from multiprocessing import Process, current_process import multiprocessing import glob as glob import matplotlib.pyplot

我实现了一个多进程脚本来改进图像分析。它工作得很好,目前我试图根据时间定义最佳数量的进程。 正如我在增加进程和减少时间时所体验到的,但这种情况也超出了cpu.count()的值。所以我不明白,我以为在这之后,我的时间又增加了……有什么解释吗

我的一段代码:

from multiprocessing import Process, current_process
import multiprocessing 
import glob as glob
import matplotlib.pyplot as plt
from skimage import io
import time
import sys
import numpy as np
import numpy.ma as ma
import gc
import os
from PIL import Image
from skimage import exposure
import cv2 


Path_input = "E:\\test\\raw\\"
Path_output = "E:\\test\\"

Img_list = glob.glob((Path_input + 'Test_*.tif' ))[:]
size_y,size_x = io.imread(Img_list[0]).shape

#Function for the multi process
def Ajustement(x):
    #image reading
    img = plt.imread(Img_list[x])

    #create a CLAHE object
    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
    cl1 = clahe.apply(img_rescale.astype(np.uint16))    

    cv2.imwrite(Path_output+ '\\Ajusted' + "%05d" % x + '.tif',cl1) 

    return 'Ajustement OK!'


#create strings list of process
cpu_max = 10
list = ['Process_']*cpu_max
list_process =[]
counter = 1
for u in list:
    list_process.append(list[counter-1]+np.str(counter))
    counter = counter+1

get_timer = time.clock if sys.platform == "win32" else time.time

time_store = []
time_process = []

if __name__ == '__main__':
    range_adjusted = np.arange(0,len(Img_list),cpu_max)
    m=0
    for m in range(0,100,1): #loop for obtain a mean time for the process
        gc.collect()
        print m
        timer = get_timer()  # time measuring starts now
        for i in range_adjusted:
            o = 0
            for item in list_process[:cpu_max]: #process creation
                globals()[item] = Process(name ='worker1', target=Normalization_and_ajustement, args=(i+o,))
                o=o+1               
            o = 0
            for item in list_process[:cpu_max]: #process start
                globals()[item].start() 
                o=o+1               
            o = 0
            for item in list_process[:cpu_max]: #process join
                globals()[item].join()  
                o=o+1   

            if i == range_adjusted.max():
                print("Normalization and Equalization finished")

                timer = get_timer() - timer  # get delta time as soon as it finishes
                time_store.append(timer)
                time_process.append(timer/cpu_max)

                np.savetxt(Path_output + 'time_tot_normalization.txt',time_store)
                np.savetxt(Path_output + 'time_process_normalization.txt',time_process)

                print("\tTotal: {:.2f} seconds".format(timer))
                print("\tAvg. per process: {:.2f} seconds".format(timer/cpu_max))
        m=m+1
它是英特尔至强E5-2630v4,频率为2.2GHz,带有2个20核插座。count()给出了40,这里是一些测试:
40个进程:322秒\ 80个进程:311秒\ 200道工序:306秒\ 500道工序:295秒\
750个进程:311秒

您发布的数字并没有显示进程数量增加后的巨大改进,但是


。。。我怀疑调用
imread
是一个因素。每个调用都是阻塞的,但在一些运行时,它会等待来自磁盘的数据,因此不会占用太多cpu时间。在此期间,核心将在其他流程上花费更多时间。由于等待来自磁盘的数据而导致内核未使用的时间减少,因此总体运行时间减少。

您可以公布cpu.count()的实际值、实际拥有的内核数以及您经历的运行时间吗?此外,如果您可以将问题中的代码减少到最低限度,可能会有所帮助。。。对不起,这太酷了。。。但是,如果你能调整并最小化代码,使其能够被潜在的回答者运行,那将是一件好事。