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情况
明明任务很多,却根本没有打满,有很多核空着,
像这些时间那就根本动也不动。
log显示确实启动了40个进程,可是那些进程好像启动之后就不动了似的。
运行的log如下:
我又试了试启动10个进程,最后程序运行时间与启用40个几乎一样长!!!
这是怎么回事?求大神指点。(那个for循环很长,计算强度够大)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
multiprocessing.Pool
只是用来启动多个进程而不是在每个core上启动一个进程。换句话说Python解释器本身不会去在每个core或者processor去做负载均衡。这个是由操作系统决定的。如果你的工作特别的计算密集型的话,操作系统确实会分配更多的core,但这也不是Python或者代码所能控制的或指定的。multiprocessing.Pool(num)
中的num可以很小也可以很大,比如I/O密集型的操作,这个值完全可以大于cpu的个数。硬件系统的资源分配是由操作系统决定的,如果你希望每个core都在工作,就需要更多的从操作系统出发了~
计算强度达不到,前面几个进程就干完了,后面的只能闲着~
我想这里应该解释的比较清楚了。https://stackoverflow.com/que...
异步进程池(非阻塞)
代码修改下, 应该能跑满CPU
试试吧
楼主,请问这个问题你解决了吗?想请教你,很急。谢谢!
博主, 你查cpu使用情况是用的什么命令