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循环很长,计算强度够大)
multiprocessing.Pool
只是用来启动多个进程而不是在每个core上启动一个进程。换句话说Python解释器本身不会去在每个core或者processor去做负载均衡。这个是由操作系统决定的。如果你的工作特别的计算密集型的话,操作系统确实会分配更多的core,但这也不是Python或者代码所能控制的或指定的。multiprocessing.Pool(num)
中的num可以很小也可以很大,比如I/O密集型的操作,这个值完全可以大于cpu的个数。硬件系统的资源分配是由操作系统决定的,如果你希望每个core都在工作,就需要更多的从操作系统出发了~