• 4.进程-1


    进程

    1.进程 process

    # 进程 process
    """
    Linux 查看后台进程 :  ps -aux
    进程号是进程的唯一标识:
        获取进程号:
            os.getpid() 获取当前进程ID号
            os.getppid() 获取当前进程的父进程ID号
    强制杀死进程 : kill -9 进程号
    """
    import os,time
    from multiprocessing import Process  #引用进程类
    
    # 1.进程基本语法
    def func():
        print("当前进程ID{},父进程ID{}, 111".format(os.getpid(),os.getppid()))
    
    if __name__ == "__main__": #为了兼容Windows和Linux,此条件必须写
        p = Process(target = func) #创建子进程对象
        p.start() #调用子进程
        # 在主进程中,打印进程ID号
        print("当前进程ID{},父进程ID{}, 222".format(os.getpid(),os.getppid()))
    """
    当前进程ID3051,父进程ID2308, 222  主进程打印的是本文件进程ID和pycharm进程ID
    当前进程ID3052,父进程ID3051, 111  子进程打印的是子进程ID和值进程ID
    """
    
    # 2.创建带有参数的进程
    def func(n):
        for i in range(n):
            print(i,"当前进程ID{},父进程ID{}, 111".format(os.getpid(),os.getppid()))
    
    if __name__ == "__main__":
        n = 10
        #target = 指定执行的任务 args = 参数元组
        p = Process(target = func ,args = (n,)) #创建子进程对象
        p.start() #调用子进程
        
        print("江山如此多娇")
    
    # 3.进程之间的数据彼此隔离
    num = 10
    def func():
        global num
        num +=1
        print(num,"子进程")
    
    if __name__ == "__main__":
        p = Process(target = func)
        p.start()
        time.sleep(0.2)
        print(num,"主进程")
    """
    11 子进程
    10 主进程
    """
    
    # 4.进程的异步性
    """
    场景在多任务当中 
    同步: 必须等我这件事干完了,你在干,只有一条主线,就是同步
    异步: 没等我这件事情干完,你就在干了,有至少两条主线,就是异步
    阻塞: 比如代码有了input,就是阻塞,必须要输入一个字符串,否则代码不往下执行
    非阻塞: 没有任何等待,正常代码往下执行.
    """
    """
    1.多个进程在执行时,是异步并发程序,因为cpu的调调策略问题,
        那个进程能更快的分配好资源就先执行
        遇到阻塞就立即切换到就绪状态的任务上,使整体效率最大化
    2.主进程默认会等待所有的子进程都执行完毕后,关闭程序,释放资源
    
    孤儿进程 : 主进程执行结束了,子进程还在运行,占用空间资源,称为孤儿进程
    僵尸进程 : 子进程都执行结束了,主进程还没有收到子进程的退出状态,
                    主进程不能释放资源,还持续的在内存中保留,称为僵尸进程
    """
    def func(n):
        print(n,"子进程ID:{},父进程ID:{}".format(os.getpid(),os.getppid()))
    
    if __name__ =="__main__":
        for i in range(6):
            p = Process(target = func,args = (i,))
            p.start()
        print("主进程结束~!")
    

    2.同步进程和自定义进程类

    # 一 : 同步主进程和子进程
    """
    语法 : 进程对象.join()
    意义 : 必须等待当前子进程执行结束后,再去执行下面的代码
    作用 : 用来同步子父进程
    """
    from multiprocessing import Process
    
    # 1.join 基本使用
    def func():
        print("第一个~")
        
    if __name__ == "__main__":
        p = Process(target = func)
        p.start()
        p.join()
        print("第二个~")
    """
    第一个~
    第二个~
    """
    
    # 2.多进程场景
    def func(n):
        print("这是第{}个~".format(n))
        
    if __name__ =="__main__":
        lst = []
        for i in range(5):
            p = Process(target = func , args = (i,))
            p.start()
            # p.join() 此处用join会导致程序由异步并发,变成同步进程,降低了执行效率
            lst.append(p) #可以先异步创建多个进程对象,放到列表中
        for i in lst: #再调用join进行同步管理
            i.join()
        print("最后一个了~")
    
    # 二 : 使用自定义进程类,创建进程
    # 1.基本写法
    """
    自定义进程类:
        必须继承父类Process
        必须定义run方法
    """
    from multiprocessing import Process 
    class MyProcess(Process):
        def run(self):
            print("生活就是这样~")
            
    if __name__ == "__main__":
        p = MyProcess()
        p.start()
        p.join()
        print("不然你要怎样~")
    """
    不然你要怎样~
    生活就是这样~
    """
    # 2.带有参数的自定义进程类
    class My(Process):
        def __init__(self,name):
            self.name = name
            super().__init__() #手动调用父类的构造方法,完成成员初始化
        def run(self):
            print(self.name)
    
    if __name__ == "__main__":
        p = My("我们是祖国的花朵~")
        p.start()
        p.join()
        print("着装好看~")
    

    3.守护进程

    # 守护进程
    """
    守护进程守护的是主进程
    当主进程的所有代码执行结束后,会立刻终止守护进程
    守护进程内无法再开启子进程,否则抛出异常
    """
    from multiprocessing import Process
    import time 
    
    # 1.基本语法
    def func():
        print("子进程启动")
    if __name__ == "__main__":
        p = Process(target = func)
        p.daemon = True #设置守护进程,在start调用之前
        p.start()
        print("主进程代码执行结束~")
    """
    主进程代码执行结束~
    """
    
    # 2.多个子进程情况
    def func1():
        print("我是老大~")
    
    def func2():
        print("我是老二~")
    
    if __name__ == "__main__":
        p1 = Process(target = func1)
        p2 = Process(target = func2)
        p2.daemon = True #把p2设置成守护程序
        p1.start()
        p2.start()
        print("主进程代码执行结束~")
    """
    主进程代码执行结束~
    我是老大~
    """
    
    # 3.守护进程用途 : 监控报活
    def alive():
        while True:
            print("1号服务器向总监控服务器报活~")
            time.sleep(0.5)
    def func():
        while True:
            try:
                print("1号服务器负责抗住1万用户量的并发访问")
                time.sleep(3) #三秒后崩溃
                raise RuntimeError #主动抛出异常
            except:
                print("1号服务器挂了...需要维护")
                break
    
    if __name__ == "__main__":
        p1 = Process(target = alive) #负责报活
        p2 = Process(target = func) #抗住用户并发
        p1.daemon = True
        p1.start()
        p2.start()
        p2.join() #必须等待2号执行完
        print("主进程代码执行结束~")
    
  • 相关阅读:
    第一次使用博客,有点小激动
    oracle中的分区表基本介绍
    【转】Apache Common HttpClient使用之七种武器
    利用Iterator删除List里相近或相同的对象
    [转]给开发维护大型项目的Java开发者的建议
    JavaScript中String对象的一些方法
    [转] ORA00913: 值过多
    [转]HTTP协议详解
    DOM解析xml
    C# 中的 == 和 .Equals()
  • 原文地址:https://www.cnblogs.com/jia-shu/p/14208853.html
Copyright © 2020-2023  润新知