day32 进程
上午:
# 1 开启子进程 #target #args # if __name__ == '__main__' #start() # 2.其它的方法: #方法: #terminate() #is_alive() #属性 #pid #name # 3. 开启多个子进程 # 4.join #阻塞等待一个子进程结束 #阻塞等待多个子进程结束 #5. 守护进程 #6.面向对象的方式实现多进程
1内容回顾
#__author : 'liuyang' #date : 2019/4/15 0015 上午 9:12 # io输入 :输入到内存 # 输出 : 从内存中输出到硬盘 # 操作系统 #单道 #多道 #分时 #并发和并行 #多个程序在一个cpu上交替 运行 #在多个cpu上多个程序 #快 # 阻塞和非阻塞 #在工作 :非阻塞 # 同步和异步 #调用一个程序,需要等待这个任务执行完后并返回结果,现在的代码才能运行 #掉一个任务,不关系这个任务是否完成,只负责调用,余下的内容 # 进程和程序 # 正在执行的程序 #统进行资源分配和调度的基本单位 #多个进程之间的数据相互隔离 # pid唯一标识 可变 另次运行 #进程的创建 和结束 #系统初始化 # 子进程 #交互式请求 # 结束: 正常退出 # 出错退出:自愿(自己设计的) #严重错误: #杀死了一个子进程 # 进程的调度 #先来先服务 #短作业优先 #分时/多道(遇到IO把cpu让出来) #多级反馈队列 # 先 短 分 都有 尤其是短,因为短作业第一优先就执行 # 第一级 时间短 执行不完的被下放 #但是 下面的优先级低 执行时间长 #比较合理 # 阻塞 是 干别的事吗? # 登录 # input() # input() # 判断用户名密码 # 不在第一优先级了 因为被阻塞 占了 import sys print(sys.argv) if sys.argv[1] == 'aa' and sys.argv[2] =='aaa': print('登陆成功') # 把放在一个列表中 类似于 *args # 启动的同时 把用户名和密码放进去
2.今日内容
# 使用模块 # multiprocessing 一个多元化的进程模块 # multiple 多元化 processing 进程 #涵盖了和进程相关的几乎 所有的内容 #process 类 帮助你启动\停止进程 # Lock 类 锁 # Queue 类
3.process类的使用
#__author : 'liuyang' #date : 2019/4/15 0015 上午 10:12 import time import os # def func(i): # time.sleep(1) # print(i,os.getpid()) # print('主:',os.getpid()) # # func(0) # func(1) # func(2) # # 同步 执行完 0 再1 再 2 # 2 .使用process 穿件一个类 ''' from multiprocessing import Process # 包 #类包 大写 def func( ): time.sleep(1) print(0,os.getpid(),os.getppid())# pid processid ppid:parent process id # Processs 进程类 if __name__ == '__main__': #多进程 是因为这里 多个操作一个文件 # windows 操作系统下开启子进程,子进程中的代码是通过import 这种方式被导入到子进程中的 # 要想不一直 循环父创子 子创子 都放到if 判断里 # mac,linux 是 copy到这来的 不需要if Process(target=func).start() Process(target=func).start() Process(target=func).start() #异步 不影响别的执行 # func的参数怎么传递 # func 不能 + 括号 加括号立刻执行 print(func()) ''' # 怎么证明是多个进程 # 几个概念 #子进程 #互不干扰 #父进程 #主进程 :run的是主 同时也是父进程 # if __name__ = '__mian__' #和进程原本没有关系 ''' def func(a,b,c): time.sleep(1) print(a,b,c,os.getpid()) print('主:',os.getpid()) # 传参 #还没开启进程(没隔离)中就已经加入 所以可以传参 from multiprocessing import Process # 包 #类包 大写 if __name__ == '__main__': Process(target=func,args=(1,2,3)).start() # 1、func的返回值能返回到父进程中么? 不行 进程开启后隔离了 #进程之间数据隔离,所以子进程中的返回值父进程获取不到 # 异步的现象 # Process 进程类 if __name__ == '__main__': p = Process(target=func,args=(1,2,3)) p.start() #p是一个进程操作符 #操作系统有空的时候开始 print(p.is_alive()) p.terminate() #终止结束一个进程 # 异步非阻塞模型 各干各的 不等待 干完了就干 # 操作系统有空的时候结束 print(p.is_alive()) time.sleep(0.1) print(p.is_alive()) print(p.name,p.pid) #Process-2 8488 #名字随机分布的 if __name__ == '__main__': for i in range(1,4): Process(target=func, args=(i,i+1,i+2)).start() # 2. process类 # 3.进程中的其它方法 # 4.如何开启多个子进程 from multiprocessing import Process import random def send_mail(name): time.sleep(random.uniform(1,3)) print('已经给%s发送邮件完毕'%name) if __name__ =='__main__': lst = ['liu','wang','zhang'] # 阻塞等在 子进程结束之后 p_l = [] for name in lst : p = Process(target=send_mail , args=(name,)) #必须元组 p.start() #异步非阻塞 #发信息需要时间 # 这样缩进同步了 #p.join() #这样阻塞,直到p对应的进程结束之后才结束阻塞 #这个思路以后会经常的用到在以后 #现在不着急用, 都执行完了 每个都用 先加入 列表中 p_l.append(p) for p in p_l : p.join() # 执行完了没有 ,每一个进程分别join print('所有的信息发送完毕了') #然后这里就抽空执行了 # ''' # 所有的信息发送完毕了 # 已经给wang发送邮件完毕 # 已经给liu发送邮件完毕 # 已经给zhang发送邮件完毕''' # 同时发 并发 效率 # ''' #守护进程 #主进程结束 守护进程也结束 然后子进程结束 import time from multiprocessing import Process def func(): # while True: for i in range(20): time.sleep(0.5) print('in func') def func2(): print('start: func2') time.sleep(5) print('end: func2') if __name__ == '__main__': p = Process(target=func) p.daemon = True #表示设置p为一个守护进程 p.start() #结束主代码,结束 不管子进程 p2 = Process(target=func2) p2.start() print('in main') time.sleep(3) print('finished') # p2.join() # 这样可以 子进程 。阻塞在这 可以等到子进程也结束 # name 里的 func()里的 # 主进程 和 子进程互不干扰 # 主进程执行完毕之后 , 会等到所有子进程结束之后 # 为什么 # 父进程要负责回收子进程的 系统资源 防止一直占用 #守护进程: #是一个子进程,守护的是主进程 #结束条件:主进程的代码结束,(主进程结束,代码还没结束,等待着子进程收尸),守护进程也结束 # 因为守护进程也是子进程(要被主进程回收),所以没法守护到主进程完全结束 # 进程 #主进程的代码结束,守护进程结束 #主进程要挥手进程(子进程)的资源 #等待其他所有子进程结束 #主进程回收所有子进程的资源 # 迭代器生成器(把变量删掉,是内存中的资源,不操作系统) 内存中的数据 资源 都不需要回收 垃圾回收机制 #内存中的这个变量 join 自己程序的级别里 #操作系统 程序里 不能删掉这个变量 # 但是操作系统的资源的 进程 #需要主进程来回收
4 和 5 的 __name__
#__author : 'liuyang' #date : 2019/4/15 0015 上午 10:43 import name_demo # print() # 'name_demo': <module 'name_demo' from 'D:\\Python\\S20\\day32\\name_demo.py'> #
#__author : 'liuyang' #date : 2019/4/15 0015 上午 10:41 # print(__file__) #内置文件中的变量 # print(__all__) # 列表里写啥 ,就可以显示啥 print([__name__]) #['__main__'] # 看当前这句话是怎么被执行的 #1. 右键直接执行 [__name__] = ['__main__'] #2. 导入这个模块执行 [__name__]= ['name_demo'] # 变量 sys.modules[__name__] 太棒了 联系 import sys print(sys.modules) # sys.modules[__name__] #<module '__main__' from 'D:/Python/S20/day32/name_demo.py'>, #用name 找到文件了 #执行的任意一个文件 name 都是 __main__ #但是被别人导入了 name 就变成了导入的文件的名字了 def func(): print('in func') if __name__ == '__main__': func() #写的所有代码是不希望这个文件作为模块被导入的时候执行的代码
6. 面向对象的多线程
#__author : 'liuyang' #date : 2019/4/15 0015 下午 12:23 # 1 开启子进程 #target #args # if __name__ == '__main__' #start() # 2.其它的方法: #方法: #terminate() #is_alive() #属性 #pid #name # 3. 开启多个子进程 # 4.join #阻塞等待一个子进程结束 #阻塞等待多个子进程结束 #5. 守护进程 #6.面向对象的方式实现多进程 import os from multiprocessing import Process class MyProcess(Process): def __init__(self,a,b): super().__init__() self.a = a self.b = b def run(self): #希望在子进程中执行的代码就放到run方法中 print(os.getpid(),self.a ,self.b) #在这里写 # def start(self): # 希望在子进程中执行的代码就放到run方法中 # print(os.getpid(), self.a, self.b) # 在这里写 # def start(self): #希望在子进程中执行的代码就放到run方法中 # print(os.getpid()) #在这里写 if __name__ == '__main__': # for i in range(10): MyProcess(1,2).start() #通知操作系统开进程,执行run方法 MyProcess(1, 2).start() # 通知操作系统开进程,执行run方法 MyProcess(1, 2).start() # 通知操作系统开进程,执行run方法 MyProcess(1, 2).start() # 通知操作系统开进程,执行run方法 MyProcess(1, 2).start() # 通知操作系统开进程,执行run方法 MyProcess(1, 2).start() # 通知操作系统开进程,执行run方法 MyProcess(1, 2).start() # 通知操作系统开进程,执行run方法 MyProcess(1, 2).start() # 通知操作系统开进程,执行run方法 MyProcess(1,2).start()#通知操作系统开进程,执行run方法 MyProcess(1, 2).start() # 通知操作系统开进程,执行run方法 MyProcess(1, 2).start() # 通知操作系统开进程,执行run方法 MyProcess(1, 2).start() # 通知操作系统开进程,执行run方法 MyProcess(1,2).start()#通知操作系统开进程,执行run方法 MyProcess(1, 2).start() # 通知操作系统开进程,执行run方法 MyProcess(1, 2).start() # 通知操作系统开进程,执行run方法 MyProcess(1, 2).start() # 通知操作系统开进程,执行run方法 # 明天默写 #0.内容回顾的概念 #1.使用multiprocess 起一个最简单的进程,执行查看子进程的进程id #2.使用多进程实现socket tcp协议的并发server端 #博客上有答案 # 敏捷编程 每一天都有一个任务 迅速提升 ,就像下象棋 # 不断的推翻自己的代码 数据结构什么的