一:开启进程的方式 第一种
from multiprocessing import Processimport timedef task(name): print(f"{name} is running ") time.sleep(3) print(f"{name} is gone")if __name__ == '__main__': p = Process(target = task,args = ('常鑫',)) p.start() print('===主') ===主常鑫 is running 常鑫 is gone
开启进程的方式 第二种
from multiprocessing import Processimport timeclass MyProcess(Process): def __init__(self,name): super().__init__() self.name =name def run(self): print(f"{self.name} is running") time.sleep(2) print(f"{self.name} is gone")if __name__ == '__main__': p = MyProcess('常鑫') p.start() print('=====主')'''=====主常鑫 is running常鑫 is gone'''
开启进程的简单应用
串行的执行结果
from multiprocessing import Processimport timedef task(name): print(f"{name} is running") time.sleep(1) print(f"{name} is gone")def task1(name): print(f"{name} is rinning") time.sleep(2) print(f"{name} is gone")def task2(name): print(f"{name} is running") time.sleep(3) print(f"{name} is gone")if __name__ == '__main__': p1 = Process(target = task ,args = ('常鑫',)) p2 = Process(target = task,args = ('李业',)) start_time = time.time() # 一个进程串行的执行三个任务 task('常鑫') task1('李业') task2('海狗') print(f"子进程:{time.time() - start_time}")''''常鑫 is running常鑫 is gone李业 is rinning李业 is gone海狗 is running海狗 is gone子进程:6.009300947189331
三个程序并发或者并行的执行三个任务
from multiprocessing import Processimport timedef task(name): print(f"{name} is running") time.sleep(1) print(f"{name} is gone")def task1(name): print(f"{name} is rinning") time.sleep(2) print(f"{name} is gone")def task2(name): print(f"{name} is running") time.sleep(3) print(f"{name} is gone")if __name__ == '__main__': p1 = Process(target = task ,args = ('常鑫',)) p2 = Process(target = task,args = ('李业',)) start_time = time.time() p1.start() p2.start() task2('海狗') print(f"结束时间{time.time() - start_time}")''''海狗 is running常鑫 is running李业 is running常鑫 is gone李业 is gone海狗 is gone结束时间3.014525890350342'''
验证昨天的结论 :
- 子进程必须依赖于主进程
- 子进程 copy 了主进程
- 子进程开辟进程,开销比较大,所以开的比较慢
二 : 进程 pid
如何区分内存中的这些进程?
命令获取所有进程的 pid windows 是 tasklist Mac是ps aux
还有一个 ps — ef
代码级别获取 pid
import osprint(os.getpid())
如何获取父进程
import osprint(os.getppid())
三 : 验证进程之间的空间隔离
不可变数据类型的时候
from multiprocessing import Processimport timeimport osname = '太白'def task(): global name name = "刚子sb" print(name)if __name__ == '__main__': p = Process(target = task) p.start() time.sleep(3) # 睡了一下,所以先执行子进程 print(f"主:{name}")# 不可变数据类型时,子进程和父进程之间是隔离的,二者毫不影响# 刚子sb# 主:太白
我们来看一下可变数据类型
无论子进程中如何操作,在主进程中都是不变的
from multiprocessing import Processimport timelst = ['丽丽']def task(): lst.append("怼姐") print(f"子进程{lst}")if __name__ == '__main__': p = Process(target = task) p.start() # time.sleep(3) # 加不加这个结果 完全不同 加了这个先输出子进程 print(f'主{lst}') 子进程['丽丽', '怼姐']主['丽丽']
总结:无论是可变数据类型,还是不可变数据类型,子进程的操作对主进程都没有影响
四 : join : 让主进程等待子进程执行结束,再执行主进程
这个怎么说呢? join 就是阻塞主进程有 join 主进程下方的代码一律不执行,直到执行完毕,但是一定切记,在开始的时候是并发的,消耗的时间也是记录在这个里面
from multiprocessing import Processimport timedef task(name): print(f"{name} is running") time.sleep(2) print(f"{name} is gone")if __name__ == '__main__': p = Process(target = task,args = ('魏无羡',)) p.start() p.join() print('===主')'''魏无羡 is running魏无羡 is gone===主'''先执行子进程,然后再执行主进程
多个子进程使用 join
from multiprocessing import Processimport timedef task(name,sec): print(f"{name} is running") time.sleep(1) print(f'{name} is gone')if __name__ == '__main__': start_time = time.time() p1 = Process(target = task,args = ('魏无羡',1)) p2 = Process(target = task,args = ('蓝忘机',2)) p3 = Process(target = task,args = ('蓝曦臣',3)) p1.start() p2.start() p3.start() print(f"主进程:{time.time() - start_time}")''''魏无羡 is running主进程:0.009562253952026367 只是主进程运行的时间蓝忘机 is running蓝曦臣 is running魏无羡 is gone蓝忘机 is gone蓝曦臣 is gone'''
下面的两个验证要好好弄明白
验证一
from multiprocessing import Processimport timedef task(name,sec): print(f"{name} is running") time.sleep(1) print(f'{name} is gone')if __name__ == '__main__': start_time = time.time() p1 = Process(target = task,args = ('魏无羡',1)) p2 = Process(target = task,args = ('蓝忘机',2)) p3 = Process(target = task,args = ('蓝曦臣',3)) p1.start() p2.start() p3.start() p1.join() p2.join() p3.join() print(f"主进程:{time.time() - start_time}") '''魏无羡 is running蓝忘机 is running蓝曦臣 is running魏无羡 is gone蓝忘机 is gone蓝曦臣 is gone主进程:1.0214881896972656'''
验证二
from multiprocessing import Processimport timedef task(name,sec): print(f'{name}is running') time.sleep(sec) print(f'{name} is gone')if __name__ == '__main__': start_time = time.time() p1 = Process(target=task,args=('常鑫',1)) p2 = Process(target=task,args=('李业',2)) p3 = Process(target=task,args=('海狗',3)) p1.start() p2.start() p3.start() # join就是阻塞 p1.join() print(f'==主1:{time.time()-start_time}') p2.join() print(f'===主2:{time.time()-start_time}') p3.join() print(f'==主3:{time.time()-start_time}') '''常鑫is running李业is running海狗is running常鑫 is gone==主1:1.0072300434112549李业 is gone===主2:2.0071139335632324海狗 is gone==主3:3.0082600116729736'''
当然还有精简代码
from multiprocessing import Processimport timedef task(sec): print(f'is running') time.sleep(sec) print(f' is gone')if __name__ == '__main__': start_time = time.time() l1 = [] for i in range(1, 4): p = Process(target=task,args=(i,)) l1.append(p) p.start() for i in l1: i.join() print(f'==主{time.time()-start_time}')'''is runningis runningis running is gone is gone is gone==主3.013340950012207'''
五 : 进程的其他参数
terminate 还有p.is_alive( ) 没被杀死返回 True 杀死之后返回 False
执行这个杀死的进程,加睡眠时间 或者是 join 给点缓存时间
args 默认返回值: Process-1
from multiprocessing import Processimport timedef task(name): print(f'{name} is running') time.sleep(2) print(f'{name} is gone')if __name__ == '__main__': p = Process(target=task,args=('常鑫',),) # 加上返回的就是 alex 不加返回的是Process-1 p.start() print(p.name) print('==主开始')
六 : 守护进程
守护进程:古时候 太监守护这个皇帝,如果皇帝驾崩了,太监直接也就死了.子进程守护着主进程,只要主进程结束,子进程跟着就结束,
from multiprocessing import Processimport timedef task(name): print(f'{name} is running') time.sleep(2) print(f'{name} is gone')if __name__ == '__main__': # 在windows环境下, 开启进程必须在 __name__ == '__main__' 下面 p = Process(target=task,args=('常鑫',)) # 创建一个进程对象 p.daemon = True # 将p子进程设置成守护进程,只要主进程结束,守护进程马上结束. p.start() # p.daemon = True # 一定要在子进程开启之前设置 time.sleep(1) print('===主')'''常鑫 is running===主'''