python使用了multiprocessing,为什么并没有加快?

def calcutype(dataframe,model,xiangguandict):
    '''主函数'''
    typelist = {}
    xiangguan = {}
    
    res = {}
    pool = multiprocessing.Pool(40)
    
    for index, row in dataframe.iterrows(): 
        scorearr = []
        name = row['data_name1'].split(',') #data_name
        descrip = row['data_descrip1'].split(',') #data_descrip
        
        #计算得出分类,与相关度
        res[index]=pool.apply_async(calcumodelnum, (name,descrip,model,xiangguandict))
            
    pool.close()
    pool.join()  
    
    for i in res:
        #本条分类相关度计算完毕
        typelist[i] = res[i].get()[0]
        xiangguan[i] = res[i].get()[1]
        
    return typelist,xiangguan
    
def calcumodelnum(***省略***):
    logging.info(multiprocessing.current_process().name+'计算完了')
    return 结果

def main():
    data1 = **省略***
    model = **省略***
    dict1 = **省略***
    calcutype(data1,model,dict1)
    
if __name__ == '__main__':
    main()

大家看到我上面的代码了,因为在40核的机器上跑,所以我启动了40个进程,但是看cpu情况

clipboard.png

明明任务很多,却根本没有打满,有很多核空着,

clipboard.png

像这些时间那就根本动也不动。

clipboard.png

log显示确实启动了40个进程,可是那些进程好像启动之后就不动了似的。

运行的log如下:

clipboard.png

我又试了试启动10个进程,最后程序运行时间与启用40个几乎一样长!!!

这是怎么回事?求大神指点。(那个for循环很长,计算强度够大)

阅读 26.2k
7 个回答

multiprocessing.Pool 只是用来启动多个进程而不是在每个core上启动一个进程。换句话说Python解释器本身不会去在每个core或者processor去做负载均衡。这个是由操作系统决定的。如果你的工作特别的计算密集型的话,操作系统确实会分配更多的core,但这也不是Python或者代码所能控制的或指定的。

multiprocessing.Pool(num)中的num可以很小也可以很大,比如I/O密集型的操作,这个值完全可以大于cpu的个数。

硬件系统的资源分配是由操作系统决定的,如果你希望每个core都在工作,就需要更多的从操作系统出发了~

计算强度达不到,前面几个进程就干完了,后面的只能闲着~

代码修改下, 应该能跑满CPU

from multiprocessing import Pool, cpu_count, current_process

data1 = '...'  # dataframe
model = '...'
dict1 = '...'
typelist = {}
xiangguan = {}
res = {}


def calcutype(row):
    index, data = row
    name = data['data_name1'].split(',')  # data_name
    descrip = data['data_descrip1'].split(',')  # data_descrip
    res[index] = calcumodelnum(name, descrip)
    logging.info(current_process().name + '计算完了')


def calcumodelnum(name, des):
    """你的计算逻辑"""
    pass


def main():
    pool = Pool(cpu_count())
    pool.map(calcutype, data1.iterrows())
    pool.close()
    pool.join()
    for i in res:
        # 本条分类相关度计算完毕
        typelist[i] = res[i].get()[0]
        xiangguan[i] = res[i].get()[1]
    return typelist, xiangguan


if __name__ == '__main__':
    main()

试试吧

新手上路,请多包涵

楼主,请问这个问题你解决了吗?想请教你,很急。谢谢!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题