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

发布于 2022-09-05 21:53:12 字数 1796 浏览 26 评论 0

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循环很长,计算强度够大)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

全部不再 2022-09-12 21:53:12

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

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

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

也只是曾经 2022-09-12 21:53:12

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

夏夜暖风 2022-09-12 21:53:12

我想这里应该解释的比较清楚了。https://stackoverflow.com/que...

避讳 2022-09-12 21:53:12

代码修改下, 应该能跑满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()

试试吧

风轻花落早 2022-09-12 21:53:12

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

惜醉颜 2022-09-12 21:53:12

博主, 你查cpu使用情况是用的什么命令

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文