使用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
posted @ 2019-09-05 21:08  btc  阅读(164)  评论(0编辑  收藏  举报