首页 > 解决方案 > 在 python 中 multiprocessing.pool.starmap() 后仅使用 20% 的 CPU

问题描述

该程序的目的是通过一个目录运行,如果一个文件是一个 Excel 电子表格,它应该打开它,提取和操作一些数据,然后移动到下一个文件。由于这是一个费力的过程,我试图将任务拆分为多个线程。即使在这之后只使用了总 CPU 容量的 20%,而且它并没有特别快。

def extract_data(unique_file_names):
    global rootdir
    global newarray
    global counter
    global t0
    string = rootdir + "\\" + str(unique_file_names[0])
    wb = load_workbook(string, read_only = True,  data_only=True)
    ws = wb["Sheet1"]
    df = pd.DataFrame(ws.values)
    newarray = df.loc[4:43,:13].values

    counter = 0
    print("Starting pool")
    pool = ThreadPool(processes=20)
    pool.map(process, unique_file_names)    
    pool.close() 

def process(filename):
    global newarray
    global unique_file_names
    global counter
    global t0
    counter+=1

    try: 
        file_name = rootdir + "/" + str(filename)
        wb = load_workbook(file_name, read_only = True,  data_only=True)
        ws = wb["Sheet1"]
        df = pd.DataFrame(ws.values)
        newarray = np.hstack((newarray, df.loc[4:43,4:13].values))
    except:
        print("Failure")
        pass

    print("Time   %.2f,  Completed  %.2f %% " %((time.clock()-t0),counter*100/len(unique_file_names)))

所以处理一个电子表格大约需要一秒半的时间,但就像我说的 pool.map() 几乎没有区别。有什么建议么?

提前致谢

标签: performancepython-multiprocessingcpu-usagepython-3.7

解决方案


推荐阅读