程序是什么?进程是什么?
本质上就是一堆代码文件,一个程序正在被操作系统读取并执行,就会变成了进程
启动进程的方式
1.系统初始化,会产生一个跟进程
2.用户的交互请求 鼠标双击某个程序
3.在一个进程发起系统调用启动另一个程序*****
4.在批处理作业开始在某些专用计算可能被使用
不同系统创建进程的方式不同
unix 《centos MAC linux》
完全拷贝父进程的所有数据,子进程可以访问父进程的数据?不可以。但是可以访问拷贝过来数据副本
windows
创建子进程,加载父进程中所有可执行的文件。
实现子进程的方式
from multiprocessing import Process #创建子进程的对象的方法 import time,os def task(name):#子进程运行的是函数 print(name,"running") time.sleep(2) print(name,"stop") if __name__ == '__main__': #创建一个子进程对象,target = 传入指定运行函数,args = kwargs = 是将函数需要的参数如何传给函数 p = Process(target=task,args=("msj",)) p.start()#启动子进程(这是就有操作系统来分配计算资源) print("父进程/当前程序进程编号",os.getpid())#获得当前执行文件的进程id print("是什么调用当前程序", os.getpid())#获得当前执行文件的父进程id print("子进程编号",p.pid)#查看子进程的id
主进程与子进程的执行顺序
一旦启动子进程,后续代码就会并发,没有先后顺序
也可以使用.join()等待子进程结束才能开始
from multiprocessing import Process import time def task(i): print(i,"start") time.sleep(i) print(i, "end") if __name__ == '__main__': start_time = time.time() for i in range(1,4): p = Process(target=task,args=(i,)) p.start() print("主进程") print("运行时间",time.time()-start_time)#这是子进程与父进程在操作系统处理优先级相同,随意随机执行。 #同时子进程存在阻塞,所以父进程会先执行,同时根据相聚时间太紧,所以根据阻塞时间输出 “”“ 主进程 运行时间 0.059999942779541016 1 start 2 start 3 start 1 end 2 end 3 end ”“”
join的使用
from multiprocessing import Process import time def task(i): print(i,"start") time.sleep(i) print(i, "end") if __name__ == '__main__': start_time = time.time() for i in range(1,4): p = Process(target=task,args=(i,)) p.start() #join()函数就是等待子进程的,无参等到结束,有参int表示等待秒数 p.join()#,这样相当于父进程需要等待每一个子进程(1+2+3+其他代码执行的时间)6.623085975646973 print("主进程") print("运行时间",time.time()-start_time)
减少join的等待时间
from multiprocessing import Process import time def task(i): print(i,"start") time.sleep(i) print(i, "end") if __name__ == '__main__': start_time = time.time() ps = [] for i in range(1,4): p = Process(target=task,args=(i,)) ps.append(p) p.start() for p in ps: p.join()#同时并发等待,所以只需要最长时间(3+) print("主进程") print("运行时间",time.time()-start_time) """ 2 start 1 start 3 start 1 end 2 end 3 end 主进程 运行时间 3.3100392818450928 """