zoukankan      html  css  js  c++  java
  • 开启进程 守护进程

    一:开启进程的方式 第一种

    from multiprocessing import Process
    import time
    def task(name):
        print(f"{name} is running ")
        time.sleep(3)
        print(f"{name} is gone")
    if __name__ == '__main__':
        p = Process(target = task,args = ('常鑫',))
        p.start()
        print('===主')
        
        
        ===主
    常鑫 is running 
    常鑫 is gone
    
    

    开启进程的方式 第二种

    from multiprocessing import Process
    import time
    class MyProcess(Process):
        def __init__(self,name):
            super().__init__()
            self.name =name
        def run(self):
            print(f"{self.name} is running")
            time.sleep(2)
            print(f"{self.name} is gone")
    if __name__ == '__main__':
        p = MyProcess('常鑫')
        p.start()
        print('=====主')
    '''
    =====主
    常鑫 is running
    常鑫 is gone
    
    '''
    

    开启进程的简单应用

    串行的执行结果

    from multiprocessing import Process
    import time
    def task(name):
        print(f"{name} is running")
        time.sleep(1)
        print(f"{name} is gone")
    def task1(name):
        print(f"{name} is rinning")
        time.sleep(2)
        print(f"{name} is gone")
    def task2(name):
        print(f"{name} is running")
        time.sleep(3)
        print(f"{name} is gone")
    
    if __name__ == '__main__':
        p1 = Process(target = task ,args = ('常鑫',))
        p2 = Process(target = task,args = ('李业',))
        start_time = time.time()
        #  一个进程串行的执行三个任务
        task('常鑫')
        task1('李业')
        task2('海狗')
        print(f"子进程:{time.time() - start_time}")
    ''''
    常鑫 is running
    常鑫 is gone
    李业 is rinning
    李业 is gone
    海狗 is running
    海狗 is gone
    子进程:6.009300947189331
    

    三个程序并发或者并行的执行三个任务

    from multiprocessing import Process
    import time
    def task(name):
        print(f"{name} is running")
        time.sleep(1)
        print(f"{name} is gone")
    def task1(name):
        print(f"{name} is rinning")
        time.sleep(2)
        print(f"{name} is gone")
    def task2(name):
        print(f"{name} is running")
        time.sleep(3)
        print(f"{name} is gone")
    
    if __name__ == '__main__':
        p1 = Process(target = task ,args = ('常鑫',))
        p2 = Process(target = task,args = ('李业',))
        start_time = time.time()
        p1.start()
        p2.start()
        task2('海狗')
        print(f"结束时间{time.time() - start_time}")
    ''''
    海狗 is running
    常鑫 is running
    李业 is running
    常鑫 is gone
    李业 is gone
    海狗 is gone
    结束时间3.014525890350342
    '''
    

    验证昨天的结论 :

    1. 子进程必须依赖于主进程
    2. 子进程 copy 了主进程
    3. 子进程开辟进程,开销比较大,所以开的比较慢

    二 : 进程 pid

    如何区分内存中的这些进程?

    命令获取所有进程的 pid windows 是 tasklist Mac是ps aux

    image-20190820112520064

    还有一个 ps — ef

    image-20190820113120105

    代码级别获取 pid
    import os
    print(os.getpid())
    
    如何获取父进程
    import os
    print(os.getppid())
    

    image-20190820113529916

    三 : 验证进程之间的空间隔离

    不可变数据类型的时候

    from multiprocessing import Process
    import time
    import os
    name = '太白'
    def task():
        global name
        name = "刚子sb"
        print(name)
    if __name__ == '__main__':
        p = Process(target = task)
        p.start()
        time.sleep(3)        # 睡了一下,所以先执行子进程
        print(f"主:{name}")
    #  不可变数据类型时,子进程和父进程之间是隔离的,二者毫不影响
    # 刚子sb
    # 主:太白
    

    我们来看一下可变数据类型

    无论子进程中如何操作,在主进程中都是不变的

    from multiprocessing import Process
    import time
    lst = ['丽丽']
    def task():
        lst.append("怼姐")
        print(f"子进程{lst}")
    if __name__ == '__main__':
        p = Process(target = task)
        p.start()
        # time.sleep(3)   
        # 加不加这个结果  完全不同 加了这个先输出子进程
        print(f'主{lst}')
        
        子进程['丽丽', '怼姐']
    主['丽丽']
    

    总结:无论是可变数据类型,还是不可变数据类型,子进程的操作对主进程都没有影响

    四 : join : 让主进程等待子进程执行结束,再执行主进程

    这个怎么说呢? join 就是阻塞主进程有 join 主进程下方的代码一律不执行,直到执行完毕,但是一定切记,在开始的时候是并发的,消耗的时间也是记录在这个里面

    from multiprocessing import Process
    import time
    def task(name):
        print(f"{name} is running")
        time.sleep(2)
        print(f"{name} is gone")
    if __name__ == '__main__':
        p = Process(target = task,args = ('魏无羡',))
        p.start()
        p.join()
        print('===主')
    '''
    魏无羡 is running
    魏无羡 is gone
    ===主
    '''
    先执行子进程,然后再执行主进程
    

    多个子进程使用 join

    from multiprocessing import Process
    import time
    def task(name,sec):
        print(f"{name} is running")
        time.sleep(1)
        print(f'{name} is gone')
    if __name__ == '__main__':
        start_time = time.time()
        p1 = Process(target = task,args = ('魏无羡',1))
        p2 = Process(target = task,args = ('蓝忘机',2))
        p3 = Process(target = task,args = ('蓝曦臣',3))
        p1.start()
        p2.start()
        p3.start()
        print(f"主进程:{time.time() - start_time}")
    ''''
    魏无羡 is running
    主进程:0.009562253952026367  只是主进程运行的时间
    蓝忘机 is running
    蓝曦臣 is running
    魏无羡 is gone
    蓝忘机 is gone
    蓝曦臣 is gone
    '''
    

    下面的两个验证要好好弄明白

    验证一

    from multiprocessing import Process
    import time
    def task(name,sec):
        print(f"{name} is running")
        time.sleep(1)
        print(f'{name} is gone')
    if __name__ == '__main__':
        start_time = time.time()
        p1 = Process(target = task,args = ('魏无羡',1))
        p2 = Process(target = task,args = ('蓝忘机',2))
        p3 = Process(target = task,args = ('蓝曦臣',3))
        p1.start()
        p2.start()
        p3.start()
    
        p1.join()
        p2.join()
        p3.join()
        print(f"主进程:{time.time() - start_time}")
        
    '''
    魏无羡 is running
    蓝忘机 is running
    蓝曦臣 is running
    魏无羡 is gone
    蓝忘机 is gone
    蓝曦臣 is gone
    主进程:1.0214881896972656
    '''
    
    

    验证二

    from multiprocessing import Process
    import time
    
    def task(name,sec):
        print(f'{name}is running')
        time.sleep(sec)
        print(f'{name} is gone')
    
    
    if __name__ == '__main__':
        start_time = time.time()
        p1 = Process(target=task,args=('常鑫',1))
        p2 = Process(target=task,args=('李业',2))
        p3 = Process(target=task,args=('海狗',3))
    
        p1.start()
        p2.start()
        p3.start()
        # join就是阻塞
    
        p1.join()  
        print(f'==主1:{time.time()-start_time}')
        p2.join()
        print(f'===主2:{time.time()-start_time}')
        p3.join()
        print(f'==主3:{time.time()-start_time}')  
        
    '''
    常鑫is running
    李业is running
    海狗is running
    常鑫 is gone
    ==主1:1.0072300434112549
    李业 is gone
    ===主2:2.0071139335632324
    海狗 is gone
    ==主3:3.0082600116729736
    '''
    

    当然还有精简代码

    from multiprocessing import Process
    import time
    
    def task(sec):
        print(f'is running')
        time.sleep(sec)
        print(f' is gone')
    
    
    if __name__ == '__main__':
        start_time = time.time()
        l1 = []
        for i in range(1, 4):
            p = Process(target=task,args=(i,))
            l1.append(p)
            p.start()
    
        for i in l1:
            i.join()
    
        print(f'==主{time.time()-start_time}')
    '''
    is running
    is running
    is running
     is gone
     is gone
     is gone
    ==主3.013340950012207
    '''
    

    五 : 进程的其他参数

    terminate 还有p.is_alive( ) 没被杀死返回 True 杀死之后返回 False

    image-20190820175020645

    执行这个杀死的进程,加睡眠时间 或者是 join 给点缓存时间

    image-20190820175129458

    args 默认返回值: Process-1

    from multiprocessing import Process
    import time
    
    def task(name):
        print(f'{name} is running')
        time.sleep(2)
        print(f'{name} is gone')
    if __name__ == '__main__':
        p = Process(target=task,args=('常鑫',),)  # 加上返回的就是 alex  不加返回的是Process-1
        p.start()
        print(p.name)
        print('==主开始')
    

    六 : 守护进程

    守护进程:
    
    古时候 太监守护这个皇帝,如果皇帝驾崩了,太监直接也就死了.
    
    子进程守护着主进程,只要主进程结束,子进程跟着就结束,
    
    from multiprocessing import Process
    import time
    
    def task(name):
        print(f'{name} is running')
        time.sleep(2)
        print(f'{name} is gone')
    if __name__ == '__main__':
        # 在windows环境下, 开启进程必须在 __name__ == '__main__' 下面
        p = Process(target=task,args=('常鑫',))  # 创建一个进程对象
        p.daemon = True  # 将p子进程设置成守护进程,只要主进程结束,守护进程马上结束.
        p.start()
        # p.daemon = True  # 一定要在子进程开启之前设置
        time.sleep(1)
        print('===主')
    '''
    常鑫 is running
    ===主
    
    '''
    
  • 相关阅读:
    ASP Loading
    haproxy中两个常用的宏
    数字签名-摘要等
    haproxy内存管理-free_list原理
    haproxy-代码阅读-内存管理
    网卡中断不均衡处理
    TIME_WAIT 另一种解决方式 SO_LINGER
    HTTP报文格式
    TIME_WAIT过多及解决
    awk如何向shell传值
  • 原文地址:https://www.cnblogs.com/hualibokeyuan/p/11384612.html
Copyright © 2011-2022 走看看