我们的目标是:通过这一套资料学习下来,可以熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。
上篇文章我们讨论了通过multiprocessing模块创建进程操作的相关知识。今天学习一下Process 、Pool类方式创建进程。
1、使用Process 子类创建进程
对于一些简单的小任务,通常使用Process(target=test)方式实现多进程。若是要处理复杂任务的进程,通常定义一个类使其继承Process类。每次实例化这个类时,就等同于实例化一个进程对象。
举例如下:使用Process子类方式创建两个子进程,分别输出父、子进程的ID等
#继承Process 类
class SubProcess(Process):
def __init__(self,interval,name=""): #重写父类的__init__()方法
Process.__init__(self)
self.interval = interval
if name:
self.name = name #若传递name不为空,则为子进程创建name属性,否则使用默认属性
def run(self): #重写了Process类的run()方法
print("子进程(%s)开始执行,父进程为(%s)" % (os.getpid(), os.getppid())) # 打印子进程pid,父进程pid
t_start = time.time() # 计时开始
time.sleep(self.interval) # 程序将会被挂起interval 秒
t_end = time.time() # 计时结束
print("子进程(%s)执行时间为'%0.2f'秒" % (os.getpid(), t_end - t_start)) # 子进程执行时间
#执行主程序
def main():
print("********父进程执行开始********")
print("父进程的PID:%s"%os.getpid()) #输出当前程序的pid
process1 = SubProcess(interval=1,name="test") #实例化进程1,挂起时间1
process2 = SubProcess(interval=2)#实例化进程2
#对于一个不包含target属性的Process 类执行start()方法,就会运行这个类中的run()方法
process1.start() #启动进程1,会执行p1.run()
process2.start() #启动进程2
#父进程继续执行,如果子进程还在执行则返回True,否在返回False
print("process1.is_alive=%s"%process1.is_alive())
print("process2.is_alive=%s"%process1.is_alive())
#输出子进程的别名和PID
print("process1.name=%s"%process1.name) #按照默认设定的名字,展示Process-1
print("process1.pid=%s" % process1.pid)
print("process2.name=%s" % process2.name) #按照我们设定的名字,展示p2name
print("process2.pid=%s" % process2.pid)
print("********等待子进程********")
process1.join()#等待子进程1结束
process2.join()
print("********父进程执行结束********")
if __name__=="__main__":
main()
主要标黄的部分和之前有差别,其它和上个例子类似。
输出结果参考:
2、使用Pool创建进程
上面介绍的通过Process 子类创建进程。若是要创建几十或者几百进程就比较麻烦了。
有没有一下创建多个进程的方法呢?可以Pool类来创建进程池。
Pool类的常用方法:
apply(func[, args[, kwds]]) 使用阻塞方式调用func函数。
apply_async(func[, args[, kwds]]):使用非阻塞方式调用func(并行执行,堵塞方式必须等待上一个进程退出才能执行下一个进程),args为传递给func的参数列表,kwds为传递给func的关键字参数列表;
close():关闭Pool,使其不再接受新的任务;
terminate():不管任务是否完成,立即终止;
join():主进程阻塞,等待子进程的退出, 必须在close或terminate之后使用;
举例参考:
import os
import time
from multiprocessing import Pool
#模拟创建最大进程数3,然后非阻塞方式执行11个任务
#子进程任务
def tasks(name):
print("子进程(%s)执行 %s,,,,"%(os.getpid(),name))
time.sleep(2) #休眠2s
def main():
print("父进程 的PID :%s。"%os.getpid())
p = Pool(3) #定义一个进程池,最大进程数3
for j in range(11): #循环执行11个任务
p.apply_async(tasks,args=(j,)) #使用非阻塞方式调用tasks()函数
print("等待子进程结束")
p.close() #关闭进程池,关闭后p不在接收新的请求
p.join() #等待子进程结束
print("所有子进程结束。")
if __name__=="__main__":
main()
输出参考:
今天先写学习到这里了,每天进步一点点。明天也要加油啊!