Python——multiprocessing包的学习心得(进程池)

         上一篇,已经说了multiprocessing包提供了进程池的概念。可以直接利用。这里,直接贴出代码简单说明一下就好。

 代码如下:

from module import IpCheck
from module import MyLogger
from multiprocessing import Pool
import time,os

def logger(filepath,linestr):
    mylogger = MyLogger(filepath)
    mylogger.logger(linestr)

def child_porcess_func():
    ip_check = IpCheck()
    ip_check.run()
    
if __name__ == '__main__':
    begin = time.time()
    filepath = "/root/workspace/NantiCpweb/src/monitor.log"
    
    ltime = time.localtime(time.time())
    timeStr = time.strftime("%Y-%m-%d %H:%M:%S", ltime)
    logstr = "main process %d run at %s (%s)\n" % (os.getpid(),timeStr,begin)
    logger(filepath,logstr)
    
    process_num = 10
    process_recond = {}
    exist_proce_num = len(process_recond)
    #signal.signal(signal.SIGCHLD,signal.SIG_IGN)
    

    flag = 0
    while(flag<6):
        pool = Pool(processes=process_num)
        result = pool.apply_async(child_porcess_func)
        #print pool.map(child_porcess_func,)
        flag = flag+1
        ltime = time.localtime(time.time())
        timeStr = time.strftime("%Y-%m-%d %H:%M:%S", ltime)
        logstr = "%s parent process-pid: %d ,run is %d times\n" % (timeStr,os.getpid(),flag) 
        logger(filepath,logstr)       
        time.sleep(10)
    
    ltime = time.localtime(time.time())
    timeStr = time.strftime("%Y-%m-%d %H:%M:%S", ltime)
    logstr =  "main process %d over at %s\n" % (os.getpid(),timeStr)
    logger(filepath,logstr)
    end = time.time() - begin
    logstr = "old-system run %s over\n\n" % end
    logger(filepath,logstr)

         利用进程池,可以很好的维护进程数,始终保持程序具有设定的子进程执行。但是,这里就没有前面提到的进程间通信的概念了(或进程同步/协调等问题)。也就是说,这需要子进程执行的任务,相互之间没有任何关系。整个程序的子任务,完全是独立的,可以高度并行的。那么,利用multiprocessing包的进程池(Pool类)挺好。

        关键点如下:

    pool = Pool(processes=process_num)  //Pool的对象初始化,设定进程数。    
    result = pool.apply_async(child_porcess_func)  //设定子进程执行的函数
        子进程中,我写了一个IpCheck类。这里就不贴出了。主要是执行相关任务的代码。在这个类里,我又实现了多线程。

         这样,就实现了“多进程/多线程”相结合。用于提高并行度。

         不过,就像上篇文章提到的。目前性能测试,测试形式是:第一组:1个进程,起100个线程。第二组:10个进程,每个进程起10个线程。测试内容,仅读取redis数据,打印出来,测试数据20万条,都是33秒左右读取完毕,最快达6666条/s左右。两组差别不是特别大。

         PS:可能测试内容过于简单,没有体现“多进程/多线程”相结合的优势。本人还是始终认为第二种更为高效一些。欢迎高手点评。

         对了,一个实际项目中,我手动起了3个进程(每个进程都有多线程),曾大大减轻了性能压力。那次,是压力测试。当时进程还没有实施管理。需要手动启动和关闭。

         现在,此项目已经升级至利用multiprocessing包实施进程管理的程序了。即“多进程/多线程”相结合。郁闷的是,数据量已经没有那么大了。单进程多线程的就搞定了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值