1.进程理论
2.使用python来完成多进程
3.进程的控制
进程 : 操作系统就好像是一个学校,每个班和每个班都有自己的进度,都能同时运行 . 一个班就可以称之为操作系统中的一个进程.
操作系统的作用 : 帮助调度硬件资源,帮助调度软件.
程序和进程之间有什么区别?
什么是程序?
1.py文件 2.java/c++/c#代码 3.QQ,酷狗等应用程序
程序运行起来就是进程.
进程是资源分配的最小单位
进程的广义定义 : 他是操作系统动态执行的基本单元,是资源分配的最小单位.
一个程序要开始他的运行一定先由操作系统分配给他一些内存.
进程调度 : 1.先来先服务调度算法 2.短作业优先调度算法 3.时间片轮转法 4.多级反馈队列
同步 : 串行(按顺序执行) 异步 : 并行(同时执行)
并行 : 有多个CPU同时执行任务
并发 : 只有一个CPU交替执行多个任务
进程 : 是个资源分配单位.
进程调度 : 就是多个进程(运行中的程序)在操作系统的控制下被CPU执行,去享用计算机的资源.
1.先来先服务
2.短作业优先
3.时间片轮转
4.多级反馈队列
进程调度的过程是不能够随意被程序影响的.
程序的并行与并发 : 并行更快,并发只是宏观上的同时执行.
进程一共有三个状态 : 就绪 运行 阻塞
进程 : pid Process ID 进程ID
ppid parent process id 父进程ID
父进程 : 负责回收一些子进程的资源
子进程
进程的创建部分:
import os
print(os.getpid())
print(os.getppid()
上面一段代码是获取 主进程ID以及父进程ID
import os
import time
from multiprocessing import Process #进程模块
def func():
time.sleep(2)
print("in func",os.getpid(),os.getppid())
if __name__ == "__main__":
print("in main",os.getpid(),os.getppid())
p1 = Process(target = func) #进程对象
p1.start() #向操作系统提交了一个开启子进程的申请
p2 = Process(target = func) #进程对象
p2.start() #向操作系统提交了一个开启子进程的申请
print("主进程的代码执行结束了")
原理
if __name__ =="__main__":
使用python,都是调用操作系统的命令,来启动程序.
同样使用python,不同的操作系统的操作结果是不同的
对于windows来说 , 必须加if __name__ == "__main__":
对于Linux iOS来说,不必要加if __name__ == "__main__":
给子进程传参数:
import os,time
from multiprocessing import Process
def func(num):
time.sleep(2)
print("in func",num,os.getpid(),os.getppid())
if __name__ == "__main__":
print("in main",os.getpid(),os.getppid())
p1 = Process(target = func,args = (1,))#进程对象
p1.start()#向操作系统提交了一个开启子进程的申请
p2 = Process(target = func,arg = (2,))#进程对象,传参时必须是元组.
p2.start()#向操作系统提交了一个开启子进程的申请
print("主进程的代码执行结束了")
其他方法和属性
1.开启多个子进程
import os,time
from multiprocessing import Process
def func(num):
print("in func",num,os.getpid(),os.getppid())
if __name__ == "__main__":
print("in main",os.getpid(),os.getppid())
for i in range(10):
p = Process(target = func,args = (i,))
p.start()#start不是运行一个程序,而是调用操作系统的命令,要创建子进程,非阻塞.
print("主进程的代码执行结束了")
2.join 方法
import os,time
from multiprocessing import Process
def func(num):
time.sleep(1)
print("in func",num,os.getpid(),os.getppid())
if __name__ =="__main__":
print("in main",os.getpid(),os.getppid())
p = Process(target = func,args = (1,))
p.start()#start不是运行一个程序,而是调用操作系统的命令,要创建子进程,非阻塞.
p.join()#阻塞,直到p这个子进程执行完毕之后再继续执行
print("主进程的代码执行结束了")
3.一批任务使用join
import os,time
from multiprocessing import Process
def func(num):
print("in func",num,os.getpid(),os.getppid())
if __name__ == "__main__":
print("in main",os.getpid(),os.getppid())
pl = []
for i in range(10):
p = Process(target = func,args = (i,))
p.start()#start不是运行一个程序,而是调用操作系统的命令,要创建子进程,非阻塞
pl.append(p)
for p in pl:
p.join()#阻塞,直到p这个子进程执行完毕之后再继续执行.
print("主程序的代码执行结束了")
4.is_alive terminate
import os,time
from multiprocessing import Process
def func(num):
time.sleep(2)
print("in func",num,os.getpid(),os.getppid())
if __name__ == "__main__":
print("in main",os.getpid(),os.getppid())
p1 = Process(target = func,args = (1,))#进程对象
p1.start()#向操作系统提交了一个开启子进程的申请
print(p1.is_alive())#检测进程是否在执行任务
p1.terminate()#强制结束子进程---非阻塞
print(p1.is_alive())#检测进程是否在执行任务,在这里会打印True,因为操作系统接收到强制结束子进程命令后,不会立即结束,这时候再检测进程,会显示True.当过了0.01秒后,在打印就会结束子进程,就会打印False.
print("主进程的代码执行结束了")
用面向对象的方式开启子进程
import os,time
from multiprocess import Process
class Myprocess(Process):
def __init__(self,num):
super().__init__()
self.num = num
def run(self):
print("in run",self.num,os.getpid(),os.getppid())
if __name__ == "__main__":
print("in main",os.getpid(),os.getppid())
p = Myprocess(1)
p.start()