multiprocessing.Process() ----------python中的多进程

python 当中 使用封装好的 multiprocessing 为咱们实现建立多进程任务。  

1 Process()方法建立子进程

使用multiprocessing.Process() 方法产生一个子进程
基本过程以下:
 1 from multiprocessing import Process  2 import os  3 from time import sleep  4 # 1 指定一个功能,绑定给子进程去完成
 5 def proc_fun(age ):  6     sleep(3)  7     print("我是子进程%s,age=%s"%( os.getpid() , age ) )  8 
 9 if __name__ =="__main__": 10     # 2 建立一个进程实例对象
11     #Process() 接收target 表明绑定要完成的函数,不绑定默认执行run方法,第二个元组是传入置顶函数的参数列表,
12     # 还能够选择性传参 name表明新建的子进程名字,还能够传入一个字典
13     p = Process( target=proc_fun ,args=( 18, ),name="哈哈1号子进程" ) 14     # 3 用start() 方法将进程建立出来而且运行
15     print("子进程开始执行。。。。") 16  p.start() 17     print("子进程已开启%s。。。。"%p.name) 18     print("开启阻塞收集。。。") 19     p.join()#用join()方法回收子进程的资源,能够传入参数多久后回收
20             # 默认是阻塞回收,表明运行完成后再回收该进程的资源 等待期间主进程不继续向下进行
21     print("收集结束")

 

2 建立多个子进程的垃圾回收:
父进程能够生成子进程,子进程再生成子进程,局面很混乱
由于子进程的资源回收全是父进程接管的。若是父进程没有回收资源,那么子进程就会丢给1号pid的进程去管理
因此咱们大量生成子进程的时候,要用父进程去生成,而后用父进程进行回收子进程的资源
 1 from multiprocessing import Process  2 import os  3 
 4 # 1 定义一个子进程须要完成的功能
 5 def proc_fun( num ,m ):  6     print("我是子进程%s,我是第%s号被建立的 m=%s"%(os.getpid(),num , m))  7 if __name__ == "__main__":  8     # 2 声明一个子进程的对象,循环调用 用一个父进程生成多个子进程
 9     jobs = [] 10     for i in range(10): 11         p = Process(target=proc_fun , args=(i,) ,kwargs={ "m":15 }) 12  p.start() 13  jobs.append(p ) 14 
15     print("进程开启结束,下面进行收集资源") 16 
17     for job in jobs: 18  job.join() 19         print("已经释放了:%s"%(p.name ) )

 

3 Process函数经常使用的参数、属性:

Process语法结构以下:

Process([group [, target [, name [, args [, kwargs]]]]])

target:表示这个进程实例所调用对象;

args:表示调用对象的位置参数元组;

kwargs:表示调用对象的关键字参数字典;

name:为当前进程实例的别名;

group:大多数状况下用不到;

Process类经常使用方法:

is_alive():判断进程实例是否还在执行;

join([timeout]):是否等待进程实例执行结束,或等待多少秒;

start():启动进程实例(建立子进程);

run():若是没有给定target参数,对这个对象调用start()方法时,就将执行对象中的run()方法;

terminate():无论任务是否完成,当即终止;

Process类经常使用属性:

name:当前进程实例别名,默认为Process-N,N为从1开始递增的整数;

pid:当前进程实例的PID值;


4 用类来实现建立进程对象:
咱们能够定义一个类,继承Process
实例化一个对象的时候,就会建立一个子进程
关键点是重写父类的run方法 调用start的时候默认调用run方法
 1 from multiprocessing import Process  2 # 本身写一个类 继承在Process
 3 class Proc( Process ):  4     #实际上在调用子进程的start() 的时候,默认会执行run() 方法
 5     # 因此要把主要的逻辑写在run方法当中
 6     def run(self):  7  self.sing()  8 
 9     def sing(self): 10         print("正在唱歌!。。。") 11 
12 
13 if __name__ == "__main__": 14     p = Proc() 15     print("子进程开始执行:") 16  p.start() 17     p.join()
相关文章
相关标签/搜索