zoukankan      html  css  js  c++  java
  • setDaemon 守护线程

    setDaemon(True):

             将线程声明为守护线程,必须在start() 方法调用之前设置, 如果不设置为守护线程程序会被无限挂起。这个方法基本和join是相反的。

             当我们 在程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程 就分兵两路,分别运行,那么当主线程完成

             想退出时,会检验子线程是否完成。如 果子线程未完成,则主线程会等待子线程完成后再退出。但是有时候我们需要的是 只要主线程

             完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以 用setDaemon方法啦

    实例1

    import threading #线程
    import time

    def Beijing(n):
    print('Beijing time is start %s' % time.strftime('%Y-%m-%d %X', time.localtime()))
    time.sleep(2)
    print('Beijing time is over %s' % time.strftime('%Y-%m-%d %X', time.localtime()))


    def Shanghai(n):
    print('Shanghai time is start %s' %time.strftime('%Y-%m-%d %X',time.localtime()))
    time.sleep(5)
    print('Shanghai time is over %s' %time.strftime('%Y-%m-%d %X',time.localtime()))


    if __name__ == '__main__':
    t1 = threading.Thread(target=Beijing,args=(10,))
    t1.setDaemon(True) #setDaemon必须要在start前 t1为守护进程,守护进程是当主线程结束后,不管子线程是否运行完也要跟着结束
    t1.start()

    t2 = threading.Thread(target=Shanghai, args=(2,))
    t2.start()
    print('Done')

     运行结果:

      Beijing time is start 2018-05-29 20:13:43
      Shanghai time is start 2018-05-29 20:13:43
      Done
      Beijing time is over 2018-05-29 20:13:45
      Shanghai time is over 2018-05-29 20:13:48

     #t1 设置守护进程,运行还是会正常方式运行,因为下面还有t2在运行;主线程不会结束

    实例2

    import threading #线程
    import time

    def Beijing(n):
    print('Beijing time is start %s' % time.strftime('%Y-%m-%d %X', time.localtime()))
    time.sleep(2)
    print('Beijing time is over %s' % time.strftime('%Y-%m-%d %X', time.localtime()))


    def Shanghai(n):
    print('Shanghai time is start %s' %time.strftime('%Y-%m-%d %X',time.localtime()))
    time.sleep(5)
    print('Shanghai time is over %s' %time.strftime('%Y-%m-%d %X',time.localtime()))


    if __name__ == '__main__':
    t1 = threading.Thread(target=Beijing,args=(10,))
    t1.start()

    t2 = threading.Thread(target=Shanghai, args=(2,))
    t2.setDaemon(True) #t2设置守护线程
    t2.start()
    print('Done')

    运行的结果是:
      Beijing time is start 2018-05-29 20:16:04
      Shanghai time is start 2018-05-29 20:16:04
      Done
      Beijing time is over 2018-05-29 20:16:06
    #Shanghai 函数最后没打印结束,是因为,t2设置了守护进程,当运行到print('Done')的时候,主线程结束了,这时候守护进程也跟着结束了

    实例3

    import threading #线程
    import time

    def Beijing(n):
    print('Beijing time is start %s' % time.strftime('%Y-%m-%d %X', time.localtime()))
    time.sleep(2)
    print('Beijing time is over %s' % time.strftime('%Y-%m-%d %X', time.localtime()))


    def Shanghai(n):
    print('Shanghai time is start %s' %time.strftime('%Y-%m-%d %X',time.localtime()))
    time.sleep(5)
    print('Shanghai time is over %s' %time.strftime('%Y-%m-%d %X',time.localtime()))


    if __name__ == '__main__':
    t1 = threading.Thread(target=Beijing,args=(10,))
    t1.setDaemon(True) #t1设置守护线程
    t1.start()

    t2 = threading.Thread(target=Shanghai, args=(2,))
    t2.setDaemon(True) #t2设置守护线程
    t2.start()
    print('Done')

    运行结果是

      Beijing time is start 2018-05-29 20:20:30
      Shanghai time is start 2018-05-29 20:20:30
      Done

      #程序运行到print('Done')主线程已经结束了,t1 t2 都是守护线程,也跟着结束了(t1  t2 后面还需要执行什么都不等待了,直接结束)

    # run():  线程被cpu调度后自动执行线程对象的run方法
    # start():启动线程活动。
    # isAlive(): 返回线程是否活动的。
    # getName(): 返回线程名。
    # setName(): 设置线程名。
    
    threading模块提供的一些方法:
    # threading.currentThread(): 返回当前的线程变量。
    # threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
    # threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

     

  • 相关阅读:
    Mycat 安全设置
    基于 HA 机制的 Mycat 高可用
    mycat中间件进行MySQL数据表的水平拆分
    mycat中间件进行MySQL数据库的垂直拆分
    mycat中间件进行MySQL的数据读写分离
    dubbo环境搭建--Windows
    分布式应用架构的发展演变RPC
    Java新特性--方法引用
    Java新特性-stream流
    Java新特性-四大函数式接口
  • 原文地址:https://www.cnblogs.com/ajaxa/p/9107636.html
Copyright © 2011-2022 走看看