上一篇文章: Python进程专题1:fork():建立子进程、getpid()、getppid()
下一篇文章: Python进程专题3:继承Process来建立进程
因为fork()没法对Windows使用,而python是跨平台的,显然须要一个新的跨平台替代品来代替它,那就是multiprocessing模块。python
multiprocessing模块中使用Process类来表明进程。segmentfault
语法:Process([group,target,name,args,kwargs]) group:至今还未使用,值始终为None target:进程实例所调用的对象,通常表示子进程要调用的函数。 args:表示调用对象的参数,通常是函数的参数 kwargs:表示调用对象的关键字参数字典。 name:当前进程实例的别名
Process类经常使用方法:函数
p.is_alive():判断进程是否还在运行。若是还在运行,返回true,不然返回false p.join([timeout]):等待进程实例执行完毕,或等待多少秒 p.run():默认会调用target指定的对象,若是没有给定target参数,对该进程对象调用start()方法时,就会执行对象中的run()方法 p.start():启动进程实例(建立子进程),病运行子进城的run方法 p.terminate():无论任务是否完成,当即终止,同时不会进行任何的清理工做,若是进程p建立了它本身的子进程,这些进程就会 变成僵尸进程,使用时特别注意,若是p保存了一个锁或者参与了进程间通讯,那么使用该方法终止它可能会致使死锁或者I/O损坏。
Process类经常使用属性:线程
p.daemon:布尔值,指示进程是不是后台进程。当建立它的进程终止时,后台进程会自动终止。而且,后台进程没法建立本身的新进城。 注意:p.daemon的值必须在p.start方法调用前设置。 p.exitcode:进程的整数退出指令。若是进程仍然在运行,它的值为None,若是值为负数:—N,就表示进程由信号N所终止。 p.name:当前进程实例别名,默认为Process-N,N为从1开始递增的整数。 p.pid:当前进程实例的PID
实例1:理解单首创建进程的相关函数code
#该实例是用来理解单首创建进程的实例 from multiprocessing import Process import os,time #将要在子进程中运行的方法 def test(name,interval): for i in range(interval): print("子进程运行中,name=%s,pid=%d,父进程:%d"%(name,os.getpid(),os.getppid())) time.sleep(interval) if __name__=="__main__": print("父进程%d"%os.getpid()) #建立进程实例,第一个参数传要在子线程执行的函数,第二个参数传函数须要的参数 p=Process(target=test,args=('mark',2)) print("子进程要执行了") #启动进程 p.start() p.join()#等待子进程运行结束再继续执行下面语句 print("子进程结束了")
结果:对象
父进程17756 子进程要执行了 子进程运行中,name=mark,pid=17758,父进程:17756 子进程运行中,name=mark,pid=17758,父进程:17756 子进程结束了
实例2:两个进程同时运行继承
from multiprocessing import Process import os import time def test1(interval): print("test1子进程运行中,pid=%d,父进程:%d"%(os.getpid(),os.getppid())) t_start=time.time() time.sleep(interval) t_end=time.time() print("test1执行时间:%0.2f秒"%(t_end-t_start)) def test2(interval): print("test2子进程运行中,pid=%d,父进程:%d"%(os.getpid(),os.getppid())) t_start=time.time() time.sleep(interval) t_end=time.time() print("test2执行时间:%0.2f秒"%(t_end-t_start)) if __name__=="__main__": print("父进程%d"%os.getpid()) #建立进程实例,第一个参数传要在子线程执行的函数,第二个参数传函数须要的参数 p1=Process(target=test1,args=(1,)) p2=Process(target=test2,name="mark1",args=(2,)) #启动进程 p1.start() p2.start() print("p2是否在运行:",p2.is_alive()) p2.join()#等待子进程运行结束再继续执行下面语句 print("p2是否在运行:", p2.is_alive())
结果:进程
父进程15080 p2是否在运行: True test1子进程运行中,pid=15081,父进程:15080 test2子进程运行中,pid=15082,父进程:15080 test1执行时间:1.00秒 test2执行时间:2.00秒 p2是否在运行: False