在进行大量数据的I/O操作时,程序会花费较多的时间。为加快程序的运行速度,在python中可使用多进程,利用多核CPU的资源提高效率。这里,请注意区分多进程和多线程的概念(进程可以简单的理解为一个可以独立运行的程序单位,它是线程的集合,进程就是有一个或多个线程构成的)。
* O8 j; x5 h4 |* N$ {Python提供了非常好用的多进程包multiprocessing,只需要定义一个函数,Python会完成其他所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。multiprocessing支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。 下面以一个数据io操作为例,原始数据文件为4个待读取操作的grib文件,读取其中的数据写入到新的nc文件中,分别使用单进程和多进程进行操作,来展示多进程的性能。 3 Q$ e1 B c& I
; G' ~) ^# `1 {6 S简单的讲,我们只需把我们所需要的操作,全部封装成一个函数,然后调用该函数,传入相应的参数,设置好实现多进程。 [Python] 纯文本查看 复制代码 pool = multiprocessing.Pool(processes=1) #设置多进程池
for file infiles_list:
print(file)
msg=file #传递参数
pool.apply_async(write_nc,(msg, )) #调用我自定义的write_nc函数,读取grib文件的数据,写入nc文件中。
pool.close() #这里的pool.close()是说关闭pool,使其不在接受新的(主进程)任务
pool.join() #这里的pool.join()是说:主进程阻塞后,让子进程继续运行完成,子进程运行完后,再把主进程全部关掉。 全部代码如下:
/ Z) |3 n N6 j2 w0 \# M[Python] 纯文本查看 复制代码 import pygrib as pg
import netCDF4 as nc
import os
from glob import glob
import multiprocessing
import datetime
def write_nc(file):
output_dir='./grib_file'
i=1
ncname=output_dir+'/'+file[-14:-5]+'.nc'
#创建nc文件
if os.path.exists(ncname):
os.remove(ncname)
#创建维度
f =nc.Dataset(ncname,'w',format = 'NETCDF4')
f.createDimension('time',91)
f.createDimension('latitude',1801)
f.createDimension('longitude',3600)
lon_nc =f.createVariable('lon', 'f4', dimensions=('latitude','longitude'))
lon_nc.units = "degrees east" # 添加变量属性
lat_nc = f.createVariable('lat','f4', dimensions=('latitude','longitude'))
lat_nc.units = "degrees north" # 添加变量属性
msl_nc =f.createVariable('msl', 'f4',dimensions=('latitude','longitude','time'),zlib=True,least_significant_digit=1)
msl_nc.units='pa'、
#读取grib文件
data=pg.open(file)
print("正在读取:",file)
msl_data =data.select(name='2 metre temperature')[0]
msl= msl_data.values
lat,lon=msl_data.latlons()
lon_nc[...]=lon
lat_nc[...]=lat
msl_nc[:,:,i]=msl
i=i+1
f.close()
print("写入完成,结束!")
if __name__=="__main__":
starttime =datetime.datetime.now()
src_dir='./grib_file'
files_list=glob(src_dir+'/*')
pool =multiprocessing.Pool(processes=1)
for file infiles_list:
print(file)
msg=file
pool.apply_async(write_nc,(msg, ))
pool.close()
pool.join()
endtime =datetime.datetime.now()
print("程序用时:")
print (endtime -starttime)
2 b4 i' {# t, W# }( Z实验结果:单进程设置(processes=1),运行该程序,运行时间为17.7s。 多进程设置(processes=4),运行时间只需要5.0s,大约为原时间的1/4。 核的多少取决于你计算机有多少可用cpu,在很多情况下,使用多进程可大大提高效率。
9 ^% P0 ~' g9 g8 X) `# B
以下全文代码均已发布至和鲸社区,点击下面链接前往,可一键fork跑通: ( p4 m8 {: k3 x+ |6 _
|