上一篇,已经说了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包实施进程管理的程序了。即“多进程/多线程”相结合。郁闷的是,数据量已经没有那么大了。单进程多线程的就搞定了。