zoukankan      html  css  js  c++  java
  • python全栈开发 * 进程理论 进程创建 * 180724

    一.进程理论
    1.进程是资源分配的最小单位.
    2.进程调度就是多个进程在操作系统的控制下被CPU执行,去享用计算机的资源.
        先来先服务
        短作业优先
        时间片轮转
        多级反馈队列
    3.进程调度的过程是不能够随意被程序影响的
    4.进程的三个状态:   就绪  运行  阻塞
        就绪状态: 当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。
        运行转态: 当进程获得处理机,其程序正在处理机上执行,此时的进程状态称为运行状态.
        阻塞状态: 正在执行的程序,由于等待某个事情发生而无法执行时,便放弃处理机而处于阻塞状态,引起进程阻塞的事件有多种,等待IO完成,
        等待信件,申请缓冲区不能满足.
    eg:
        程序在开始运行之后,并不是立即开始执行代码,而是会进入就绪状态,等待操作系统调度开始运行
        import time
        print("程序开始运行")    程序运行状态
        name=input(">>>")    等待用户输入  程序进入阻塞状态
        用户输入后进程并不是立即执行,而是进入就绪状态,等待操作系统的调度继续运行
        print(name)   运行状态
        time.sleep(1)   阻塞状态
            就绪状态
        print("程序结束运行")   运行状态
            结束
    5.进程三状态转换流程图:
        a.创建--(提交)--> 就绪--(进程调度)--> 运行--(释放)--> 退出
        b.创建--(提交)--> 就绪--(进程调度)--> 运行--(时间片结束)--> 就绪
        c.创建--(提交)--> 就绪--(进程调度)--> 运行--(事件请求IO)--> 阻塞--(事件发生)--> 就绪
    6.PID  和  PPID
        PID:    ProcessID   进程ID
        PPID:   parent processID  父进程ID    (父进程回收子进程的一些资源)
    二.进程的创建与结束
    1.进程的创建
        引入:但凡是硬件,都需要有操作系统去管理,只要有操作系统就有进程的概念,就需要有创建进程的方法.
        对于通用系统(跑很多应用程序),需要有系统运行过程中创建或撤销进程的能力.主要有四种形式创建新的进程.
        (1).系统初始化(查看进程 linux中用ps命令,windows中用任务管理器,前台进程负责与用户交互,后台运行的进程与用户无关,运行在
        运行在后台并且只在需要时才唤醒的进程,称为守护进程,(如"电子邮件","web页面","新闻","打印")
        (2).一个进程在运行过程中开启了子进程(os)
        (3).用户的交互式请求,而创建一个新进程("双击qq")
        (4).一个批处理作业的初始化(只在大型机的批处理系统中运用).
        创建子进程unix和windows的异同:
        相同点:进程创建后,父进程和子进程有各自不同的地址空间(多道技术要求物理层面实现进程之间内存的隔离),任何一个进程
                的在其地址空间中的修改都不会影响到另外一个进程。
        不同点: 在UNIX中,子进程的初始地址空间是父进程的一个副本,提示:子进程和父进程是可以有只读的共享内存区的。但是对于
                windows系统来说,从一开始父进程与子进程的地址空间就是不同的。
    2.进程的结束
        (1)正常退出(自愿,用户点击交互式页面的叉号,或程序执行完毕调用发起系统调用正常退出,在linux中用exit,在windows中用ExitProcess)
        (2)出错退出(自愿,python a.py中a.py不存在)
        (3)严重错误(非自愿,执行非法指令,如引用不存在的内存,可以捕捉异常,try...except...)
        (4)被其他进程杀死(非自愿,如右键结束进程
    三.在python程序中的进程操作
    multiprocess不是一个模块而是python中一个操作、管理进程的包。 之所以叫multi是取自multiple的多功能的意思,在这个包中几
    乎包含了和进程有关的所有子模块。由于提供的子模块非常多,为了方便大家归类记忆,
    我将这部分大致分为四个部分:创建进程部分,进程同步部分,进程池部分,进程之间数据共享。
    multiprocess.process
    1.process模块介绍: process模块是一个创建进程的模块.借助这个模块,就可以完成进程的创建.
      Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,表示一个子进程中的任务(尚未启动)
        强调:
        (1). 需要使用关键字的方式来指定参数
        (2). args指定传给target函数的位置参数,是一个元组形式,必须有逗号
        参数介绍:
        (1) group参数未使用,值始终为None
        (2)target表示调用对象,即子进程要执行的任务
        (3) args表示调用对象的位置参数元组,args=(1,2,'egon',)
        (4) kwargs表示调用对象的字典,kwargs={'name':'egon','age':18}
        (5) name为子进程的名称
        方法介绍:
        (1) p.start():启动进程,并调用该子进程中的p.run()
        (2) p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法
        (3) p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这
        种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁
        (4) p.is_alive():如果p仍然运行,返回True
        (5) p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强
        调的是,p.join只能join住start开启的进程,而不能join住run开启的进程
    在windows中使用process模块的注意事项:
        在Windows操作系统中由于没有fork(linux操作系统中创建进程的机制),在创建子进程的时候会自动 import 启动它的这个文件,
        而在 import 的时候又执行了整个文件。因此如果将process()直接写在文件中就会无限递归创建子进程报错。所以必须把创建子进程
        的部分使用if __name__ ==‘__main__’ 判断保护起来,import 的时候  ,就不会递归运行了。
    四.创建进程
    (一).创建一个进程 并给子进程传参
    import os
    import time
    from multiprocessing import Process
    def func(num):    #形参num
    
        print("in func",num,os.getpid(),os.getppid())      #4  in func 1 4376 3180     #6 in func 2 20072 3180
        print(__name__)                                 #5 __mp_main__                  #7 __mp_main__
    if __name__=="__main__":
    
        print("in main",os.getpid(),os.getppid())      #1   in main 20208 20572
        p=Process(target=func,args=(1,))      #关键字传参
        p.start()
        p1=Process(target=func,args=(2,))    #用args,必须是元组形式( , )
        p1.start()
        print(__name__)                                #2  __main__
        print("主进程结束")                           #3 主进程结束
    原理:
    if __name__ == '__main__':
        使用python都是调用操作系统的命令来启动进程
        同样使用python 不同的操作系统的操作是不同的
        对于windows来说 必要加if __name__ == '__main__':
        对于linux ios来说 不必要加if __name__ == '__main__':
    

     (二).其他方法和属性

    1.开启多个子进程
    import os
    from multiprocessing import Process     #Process 是一个类
    def func(num):     #形参num
        print("in func",num,os.getpid(),os.getppid())
        print(__name__)   # __mp_main__
    if __name__=="__main__":
        print("in main",os.getpid(),os.getppid())
        for i in range(10):
            p=Process(target=func,args=(i,))  # 关键字传参  必须是元组形式,用逗号隔开.
            p.start()          #向操作系统提交开启一个子进程的申请
        print("主进程结束")
    2.join 方法
    import os
    import 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()    #不是运行一个程序,而是调用操作系统的命令,要创建子进程
        p.join()     #阻塞直到p这个子进程执行完毕之后再继续执行后面的代码
        print('主进程的代码结束')
    3.一批任务用join
    import os
    import 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())
        p_l = []
        for i  in range(10):
            p=Process(target=func,args=(i,))
            p.start()
            p_l.append(p)
        print(p_l)
        for p in p_l:
            p.join()
        print("主进程代码结束")
    4.is_alive  terminate
    import os
    import 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())
        p=Process(target=func,args=(1,))
        p.start()
        print(p.is_alive())   # True 检测进程是否在执行任务
        p.join()    #   阻塞  等子进程结束后再执行后面的代码
        print(p.is_alive())      #False    子进程任务已经结束
        p.terminate()    #强制结束子进程    非阻塞
        print(p.is_alive())
    5.用面向对象的方式开启子进程
    import os
    from multiprocessing 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()
     
  • 相关阅读:
    netcat命令
    CSS 中背景图片定位方法
    Eclipse 安装svn插件及使用
    【Mysql】数据库为啥会出现_encrypt和_warning成对的表
    【Mysql异常】[HY000][1030] Got error 28 from storage engine
    【Nginx】使用certbot安装免费https证书使Nginx支持Https请求
    【Nginx】将http升级到https并且同时支持http和https两种请求
    【异常】org.eclipse.jgit.api.errors.TransportException: git@xxx.xxx.xxx/base-config-center.git: channel is not opened.
    【Spring Boot】Spring Boot之利用Logstash将日志转换成以JSON的格式存储和输出
    【Spring Cloud】Spring Cloud之Zipkin server搭建以及RabbitMQ收集,分布式服务跟踪(3)
  • 原文地址:https://www.cnblogs.com/J-7-H-2-F-7/p/9385403.html
Copyright © 2011-2022 走看看