python 之 multiprocessing模块实现进程池

依旧直接脚本实例讲解:

本脚本是根据文件后缀来确定输出什么内容到error日志文件

其中用到了进程池,加锁写文件等内容。。。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import multiprocessing
import time
import sys
import re
import os
import sre_compile
import subprocess
import commands
from subprocess import Popen, PIPE

#线程调用的函数
def worker_codecheck(line,i,file_tail,lock):
    if Match(r'(java|JAVA|Java)',file_tail):
        os.system('echo "java|JAVA|Java" >/root/errors_%s.txt'%i)
    elif Match(r'(cpp|CPP|hpp|h)',file_tail):
        #获取写入错误信息的文件的文件对象
        f = open(r'/root/errors_%s.txt'%i,'w')
        #调用cpplint检查并将输出的错误信息写入error文件
        p = Popen('python /home/cpplint.py --verbose=5 %s'%line, shell=True, stderr=f) 
        #等待检查结束
        p.wait()
    #不需要检查的后缀文件
    else:
        print 'The document does not need to be checked:%s'%line
        return
    #操作文件时加锁,将errors_%s.txt文件的内容都输出到errors_1.txt中
    if (i > 1) and lock.acquire():
        os.system('cat /root/errors_%s.txt >> /root/errors_1.txt'%i)
        #释放
        lock.release()

def main(): 
    #切换到项目目录下面
    os.chdir('/root')
    #打印当前时间
    print time.strftime(ISOTIMEFORMAT, time.localtime(time.time()))
    #读取文件开始检查
    lines=open('filelist','r').readlines()
    #创建进程池,限制最多有5个进程,防止进程过多 set the processes max number 5
    pool = multiprocessing.Pool(processes = 5)
    #创建lock,写文件时使用
    lock = multiprocessing.Manager().Lock()
    for i in range(len(lines)):
        #获取文件后缀:os.path.basename(lines[i])是获取文件名
        file_tail = (os.path.basename(lines[i]))[(os.path.basename(lines[i])).rfind('.') + 1:]
        if Match(r'(java|JAVA|Java|cpp|CPP|hpp|h)',file_tail) :
            #调用线程检查函数 结果输出到:errors_1.txt :
            pool.apply_async(worker_codecheck, (lines[i],(i+1),file_tail,lock))
    #关闭pool,不再接受新的任务
    pool.close()
    #主进程阻塞,等待子进程的退出,join方法要在close或terminate之后使用
    pool.join()       
    print time.strftime(ISOTIMEFORMAT, time.localtime(time.time()))

if __name__ == "__main__":
    main() 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值