开启进程的 两种方式
重要结论:
1、p.join([timeout]):是Process模块给我们提供的对子进程同步管理的方法!
timeout是可选的超时时间,如 timeout=2 就是罩着这个线程2s 以后,就不管他了,继续执行下面的代码。
2、主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态),
需要强调: p.join只能join住start开启的进程,而不能join住run开启的进程
3、p.join()是让主线程等待p的结束,卡主的是主进程而不是子进程p!
4、如果有多个进程同时join,花费的总时间仍是耗时最长的那个进程的运行时间,不是所有运行的时间的和!
一、函数方法
# -*- coding:utf-8 -*- import os import time from multiprocessing import Process def task(name): print('%s is running,pid:%s'%(name,os.getpid())) time.sleep(1.5) print('%s is done'%name) if __name__ == '__main__': lis = [] for i in range(1,4): p = Process(target=task,args=('whw-%s'%i,)) lis.append(p) p.start() for i in lis: i.join() print('主进程...')
效果:
二、面向对象的方法
# -*- coding:utf-8 -*- import os import time from multiprocessing import Process # 必须继承 Process class MyProcess(Process): # 需要的参数在init方法中传 def __init__(self,name): # 注意继承父类的init方法 super().__init__() self.name = name # 注意必须叫run def run(self): print('%s is running,pid:%s'%(self.name,os.getpid())) time.sleep(1.5) print('%s is done'%self.name) if __name__ == '__main__': lis = [] for i in range(1,4): p = MyProcess('wanghw-%s'%i) lis.append(p) # start会自动调用run p.start() for i in lis: i.join() print('主线程')
效果: