使用multiprocessing库开启复数进程完成任务
当需要处理的数据量较大时,我们需要充分利用计算机的资源来降低程序的运行时间,这时我们可以使用multiprocessing库建立多个进程
multiprocessing库同样可以建立多个线程,但是python作为解释型语言,系统会把建立的多线程序列化逐个运行,并没有利用多核cpu的并行运算性能,因此推荐使用多进程优化
首先引用multiprocessing库的process模块
from multiprocessing import Process
使用多进程完成任务首先需要切分流程,将可以并行处理的任务独立出来包装成函数
接下来是建立主进程启动程序,我使用列表p来管理复数进程
利用循环将每个进程需要用到的文件保存好之后,使用start()依次启动所有进程
使用join()等待所有分进程全部结束
if __name__ == "__main__": totalprocess=14 p=[] step=int(len(all_lines)/totalprocess)+1 #print(len(all_lines)) #print(step)for i in range(totalprocess) : linex=all_lines[i*step:(i+1)*step] f=open("./data/"+'line'+str(i)+'.txt','w') for l in linex : f.write(l) f.close() print(len(linex)) #Process(target=processdeal,args=("./data/"+'line'+str(i)+'.txt',)).start() a=Process(target=processdeal,args=("./data/"+'line'+str(i)+'.txt',)) p.append(a) p[i].start() for i in range(totalprocess) : p[i].join()
其中processdeal是包装的需要并行处理的任务,我前面用爬虫爬取数据的任务封装进了这个函数
def processdeal(name): f=open(name,'r') all_lines=f.readlines() f.close for line in all_lines: getbuslin(line) checkdict() df = pd.DataFrame(df_dict) df.to_csv(name+'.csv', encoding='utf-8', index=None)
使用计时器计算了运行时间之后发现,多进程优化后的程序运行时间为单进程运行时间的20%甚至可以更低。
这里我只使用了最简单的启动和阻塞两个函数,multiprocessing库还有很多非常实用的函数可以使用,后面我会尝试实现更复杂的多机分发并行完成任务。
multiprocessing