一、进程与多道技术
二、主程序
三、进程理论
四、主进程与子进程的执行顺序
五、父进程等待子进程结束
六、开启子进程的方式
七、进程对象常用属性
一、进程与多道技术
什么是进程 一个正在运行的程序称之为进程 是一种抽象概念 表示一个执行某件事情的过程 进程的概念 起源于操作系统
第一代计算机 程序是固定 无法修改 某种计算机只能干某种活 第二代批处理系统 需要人工参与 将程序攒成一批 统一执行 串行执行 提高计算机的的利用率 但是调试麻烦 第三代计算机 为了更好利用计算机资源,产生了 多道技术: ****** 1.空间复用 内存分割为多个区域 每个区域存储不同的应用程序
2.时间的复用 1.当一个程序遇到了I/O操作时 会切换到其他程序 (切换前需要保存当前运行状态 以便恢复执行) 提高效率
2.当你的应用程序执行时间过长 操作系统会强行切走 以保证其他程序也能正常运行 当然因为cpu速度贼快 用户感觉不到 降低效率 3.有一个优先级更高的任务需要处理 此时也会切走 降低了效率 我们编写程序时 只能尽量减少I/O操作
总的来说 有了多道技术之后 操作系统可以同时运行多个程序吧 这种情形称之为并发 但是本质好 这些程序还是一个一个排队执行
并发 在同一个时间段内 发生的多个事情 并行 在同一时刻 同时进行多个事情 串行 许多任务排队执行 第一个任务没执行完 第二个只能等待 此时不叫阻塞 因为CPU执行权还在手里 依然在执行你的代码
第一个任务做不下去 i/o操作 此时就是阻塞 因为cpu被分配给其他进程
总结一下:只要还拥有cpu的执行权 就不叫阻塞
非阻塞
同步 和 异步
print("asasasasassasasasasasasdfsfsdfsdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff") print("over") input(">>>>:")
二、主程序
from multiprocessing import Processimport time,os# def task(name):# print("process running")# time.sleep(3)# print("process stop")# if __name__ == '__main__':# # 为毛创建进程# # 1.创建一个进程对象 需要传入你要做的任务 就是一个函数对象# p = Process(target=task)# # 2.启动它# p.start()# 当你完成的任务需要参数时def task(name): print(name," running") time.sleep(3) print(name," stop")print(__name__)# windows 开启子进程 必须放到if中 只要你的开启子进程的代码处于全局 范围 你就应该放到if判断中if __name__ == '__main__': # 为毛创建进程 为了帮父进程做事情 # 1.创建一个进程对象 需要传入你要做的任务 就是一个函数对象 p = Process(target=task,kwargs={ "name":"jerry"}) # 2.启动它 p.start() print(id(p)) print("我是主程序我的pid:%s 我的父进程是:%s" % (os.getpid(),os.getppid())) print("我有一个儿子是 %s" % p.pid)#
三、进程理论
进程和程序的区别 程序是什么? 本质就是一堆代码文件!
一个程序正在被操作系统读取并执行 就变成了进程
一个程序只能有一个进程吗? 可以 启动一次就产生一个进程 当然可以用代码控制是否允许多进程
启动进程的方式 1.系统初始化 会产生一个根进程 2.用户的交互请求 鼠标双击某个程序 3.在一个进程中 发起了系统调用启动了另一个进程 ****** 4.批处理作业开始 某些专用计算机可能还在使用
不同操作系统创建进程的方式不同 unix < centos mac linux 完全拷贝父进程的所有数据 子进程可以访问父进程的数据吗?不可以 但是可以访问拷贝过来数据副本 windows 创建子进程 加载父进程中所有可执行的文件
四、主进程与子进程的执行顺序
from multiprocessing import Processimport timedef task(name): print("%s start" % name) time.sleep(3) print("%s stop" % name)if __name__ == '__main__': p = Process(target=task,args=("jerry",)) p.start() print("我是主进程!!!") time.sleep(100) print("我是主进程!!! over")# 主进程一定是先是# 一旦启动子进程 后续的代码就并发 没有先后顺序# 如果父进程需要等待子进程结束后才能执行
五、父进程等待子进程结束
from multiprocessing import Processimport time# def task(name):# print("%s start" % name)# time.sleep(3)## print("%s stop" % name)## if __name__ == '__main__':# p = Process(target=task,args=("jerry",))# p.start()# p.join(3) #父进程必须等到子进程完成后才能继续执行 可设置等待超时时间# print("我是主进程!!!")# def task(i):# print("%s start" % i)# # time.sleep(2)# # print("%s stop" % i)## if __name__ == '__main__':# for i in range(1,11):# p = Process(target=task,args=(i,))# p.start()# print("主进程!!!!")# 我们的代码只负责 通知操作系统创建进程 创建完就继续其他代码# 但是操作系统什么时候创建完成 什么时候执行我们无法预知无法控制def task(i): print("%s start" % i) time.sleep(2) print("%s stop" % i)if __name__ == '__main__': start_time = time.time() ps = [] for i in range(1,3): p = Process(target=task,args=(i,)) p.start() ps.append(p) # 主进程等子进程结束 for p in ps: p.join() print("主进程!!!!",time.time()-start_time)
六、开启子进程的方式
#from multiprocessing import Process### class MyProcess(Process):# # 当进程被执行时 其实执行的就是run函数# def run(self):# print("这是 run被执行了!")#### def ttt():# print("11111")# if __name__ == '__main__':# mp = MyProcess()# mp.start()## p = Process(target=ttt)# p.start()## 记住语法就okclass MyProcess(Process): def run(self): print("你要做的事情 放在run中!")if __name__ == '__main__': MyProcess().start() print("主")
七、进程对象常用属性
from multiprocessing import Processimport timedef task(name): print("start",name) time.sleep(5) print("stop",name)if __name__ == '__main__': p = Process(target=task,args=("jerry",),name="jerrr process-1") p.start() # p.join() # 让父进程等待子进程结束 让父进程让出了CPU执行权 print(p.name) print(p.pid) # 获取这个进程的id p.terminate() # 结束子进程 print(p.is_alive()) # 进程是否还存活 # p这个进程的父进程 是7.进程对象常用属性.py这个进程 import os print(os.getpid()) # 当前自己进程的id print(os.getppid())# pycharm的进程id #父进程如何获取子进程中数据 跨进程通讯