• python3 守护进程daemon


     什么是守护进程?

    import time
    from multiprocessing import Process
    
    
    def func(name):
        while 1:
            time.sleep(0.5)
            print(f"我是{name}")
    
    
    if __name__ == '__main__':
        p1 = Process(target=func, args=("进程1",))
        p1.daemon = True  # 必须写在子进程启动前,主进程守护子进程,主进程结束,子进程直接结束
        p1.start()
        time.sleep(2)
        print("主进程执行结束。")

    执行结果:

    我是进程1
    我是进程1
    我是进程1
    主进程执行结束。

    主进程守护子进程,主进程结束,子进程直接结束

    关于守护进程需要强调两点:

    其一:守护进程会在主进程代码执行结束后就终止

    其二:守护进程内无法再开启子进程,否则抛出异常

    守护进程必须在开启子进程前开启

    from multiprocessing import Process
    import time
    
    
    def task(name):
        print("%s is running" % name)
        time.sleep(3)
        print("%s is done" % name)
    
    
    if __name__ == '__main__':
        t = Process(target=task, args=("子进程1",))
        # 守护进程必须在开启子进程前开启
        t.daemon = True
        t.start()
        time.sleep(1)
        print("")

    执行结果:

    子进程1 is running
    主

    在主进程代码执行完毕,只要出现打印主进程信息,p1就不会执行或者死掉

    from multiprocessing import Process
    import time
    
    
    def foo():
        print(123)
        time.sleep(1)
        print("end123")
    
    
    def bar():
        print(456)
        time.sleep(3)
        print("end456")
    
    
    if __name__ == '__main__':
        p1 = Process(target=foo)
        p2 = Process(target=bar)
    
        p1.daemon = True
        p1.start()
        p2.start()
        print("main------")

    执行结果:

    main------
    456
    end456

    接着看下面的程序

    from multiprocessing import Process
    import time
    
    
    def foo(name):
        print("%s 开始" % name)
        time.sleep(1)
        print("%s end123" % name)
    
    
    if __name__ == '__main__':
        p1 = Process(target=foo, args=("进程1",))
        p2 = Process(target=foo, args=("进程2",))
        p3 = Process(target=foo, args=("进程3",))
    
        p1.daemon = True
        p1.start()
        p2.start()
        p3.start()
        print("main------")

    执行结果:

    main------
    进程3 开始
    进程2 开始
    进程3 end123
    进程2 end123

     

    再看最后一个程序

    import time
    from multiprocessing import Process
    
    
    def func(name, sec):
        print(name, 123)
        time.sleep(sec)
        print(name, "123end")
    
    
    if __name__ == '__main__':
        p1 = Process(target=func, args=("进程1", 1))
        p2 = Process(target=func, args=("进程2", 2))
        p3 = Process(target=func, args=("进程3", 3))
        p1.daemon = True  # 必须在start()之前设置守护进程
        p1.start()
        p2.start()
        p3.start()
        time.sleep(0.5)
        print("主进程结束,主进程还得等待其他子进程(非守护进程)结束才行")

     执行结果:

    进程1 123
    进程3 123
    进程2 123
    主进程结束,主进程还得等待其他子进程(非守护进程)结束才行
    进程2 123end
    进程3 123end
  • 相关阅读:
    使用psycopg2操作PostgreSQL数据库之二
    .Net3.5中调用gzip压缩遇到的问题
    开发人员真的不值钱啊
    Python DBAPI 2.0规范
    python MySQLdb学习笔记
    python访问PostgreSQL数据库之连接库Psycopg2
    python的类方法和类的静态方法
    Python运算符重载
    windows下postgreSQL服务接收远程客户连接
    MySQLdb访问mysql的中文字符问题解决之道
  • 原文地址:https://www.cnblogs.com/lilyxiaoyy/p/10967275.html
Copyright © 2020-2023  润新知