1.开启进程的两种方法
第一种:
from multiprocessing import Process import time def tak(name): print('%s 进程' % name) time.sleep(2) print('%s 子进程 ' % name) if __name__ =='__main__': p1 = Process(target=tak,args=(1,)) # 创建线程 p2 = Process(target=tak,args=(2,)) p3 = Process(target=tak,args=(3,)) p4 = Process(target=tak,args=(4,)) p5 = Process(target=tak,args=(5,)) p1.start() # 向操作系统发送请求执行命令,但是操作系统什么时候执行就是操作系统的事了 p2.start() p3.start() p4.start() p5.start() print('主')
结果:
主 # 先运行的是主进程,因为开进程开销较大,时间比较长,当其他进程还没起来的时候,就会直接去执行主进程 1 进程 2 进程 4 进程 3 进程 5 进程 # 这里是会堵塞的,因为上面sleep了2秒,所有子进程都在这里进行堵塞了2秒后再进行打印,这里的结果为什么不是按顺序的,因为执行是操作系统进行执行的,你只能提交请求 1 子进程 2 子进程 4 子进程 3 子进程 5 子进程
第二种: 这里自己写类进行继承Process
from multiprocessing import Process import time class Tak(Process): def __init__(self,name): super().__init__() # 这里要加载Process中的方法 self.name = name def run(self): # 这里必须是run方法 print('%s 进程' % self.name) time.sleep(3) print('%s 子进程' % self.name) if __name__ == '__main__': p1 = Tak('1') # 创建进程直接往自己的类里面进行传值就可以了 p2 = Tak('2') p3 = Tak('3') p4 = Tak('4') p5 = Tak('5') p1.start() p2.start() p3.start() p4.start() p5.start() print('主')
二、查看进程ID号:
查看当前进程id:os.getpid()
查看该进程的父级进程id: os.ppid()
from multiprocessing import Process import time,os def tak(): print('%s 进程' % os.getpid(),os.getppid()) time.sleep(2) print('%s 子进程 ' % os.getpid(),os.getppid()) if __name__ =='__main__': p1 = Process(target=tak,) p2 = Process(target=tak,) p3 = Process(target=tak,) p4 = Process(target=tak,) p5 = Process(target=tak,) p1.start() p2.start() p3.start() p4.start() p5.start() print('主',os.getpid(),os.getppid()) # 你用什么运行的python,那么它的父级进程id号就是谁的进程id号,我这里用的是pycharm,它的父级进程id是pycharm的进程id
三、Process 中的 join方法
当主进程运行过程中如果想并发去处理其他的任务的时候,我们可以去开启子线程,主线程与子进程任务分为两种:
1、主进程与子进程的任务都是独立的时候,主进程运行完后要等子进程运行完后才回收资源
2、主进程进行运行的时候需要子进程的结果才能进行运行,就要等子进程运行完后主进程才开始运行,这里就要用到join方法了
from multiprocessing import Process def tak(name): print('%s 进程' % name) print('%s 进程' % name) if __name__ == '__main__': # 这里在windows系统中开启进程一定是要在这个下面进行开进程的,不然会报错:IndentationError: unexpected indent p1 = Process(target=tak,args=(1,)) p2 = Process(target=tak,args=(2,)) p3 = Process(target=tak,args=(3,)) p1.start() p2.start() p3.start() p1.join() # 等待p1结束,在等p1结束的时候,其他进程也在运行,这里是并行运行 p2.join() p3.join() print('主') # 等前面的子进程运行完了才运行主进程,注意:注意只是主进程在阻塞,子线程都在并发执行
结果:
1 进程 1 进程 2 进程 2 进程 3 进程 3 进程 主
串行执行:这里如果要改成串行执行的话就要一个进程执行完了才执行下一个,这样确保了执行顺序,但是这样效率很低
from multiprocessing import Process def tak(name): print('%s 进程' % name) print('%s 进程' % name) if __name__ == '__main__': p1 = Process(target=tak,args=(1,)) p2 = Process(target=tak,args=(2,)) p3 = Process(target=tak,args=(3,)) p1.start() # 这里执行一个进程就要等这个进程执行完了才执行下一个 p1.join() p2.start() p1.join() p3.start() p1.join() print('主')
四、Process的其他属性
1、is_alive() 查看当前进程是否存活,存活返回True,否则返回False
2、terminate() 向操作系统发送关闭该进程的请求,与start()相反
3. name 查看当前进程的进程名
4. pid 查看当前的进程的id号
from multiprocessing import Process def tak(name): print('%s 进程' % name) print('%s 进程' % name) if __name__ == '__main__': p1 = Process(target=tak,args=(1,),name='卢本伟') # 可在这里指定线程名,如果没指定,默认Process-1 p1.start() p1.terminate() # 向操作系统发生关闭这个进程的请求,只是发送请求,什么时候关闭是操作系统的事 print(p1.is_alive()) # 查看进程是否还是存活 存活为True 死了False print(p1.name,p1.pid) # 这里name 可以访问该进程的指定的进程名,pid是可以查看进程的编号, # 这里是僵尸进程,在主进程还未关闭的时候可进行访问子进程的pid,当主进程关闭后会进行消除
结果:
True
卢本伟 5728
这里会发现为什么请求了关闭线程为什么还是存活,因为只是发送请求,什么时候关闭是操作系统的事情,所以要立即关闭需要在后面加上join(),等它运行接收后再执行下一步