Python线程:线程的调度-守护线程

Python线程:线程的调度-守护线程
 
守护线程与普通线程写法上基本么啥区别,调用线程对象的方法setDaemon(true),则可以将其设置为守护线程。在python中建议使用的是thread.demon = true 使用这个方法可以检测数据合法性
 
守护线程使用的情况较少,但并非无用,举例来说,Python的垃圾回收、内存管理等线程都是守护线程。还有就是在做数据库应用时候,使用的数据库连接池,连接池本身也包含着很多后台线程,监控连接个数、超时时间、状态等等。
 
setDaemon方法的详细说明:
# 属性进行封装 以方便对数据传入值合法性进行判断
@daemon.setter   # 将self._daemonic 
    def daemon(self, daemonic):
        if not self._initialized:
            raise RuntimeError("Thread.__init__() not called")
        if self._started.is_set():
            raise RuntimeError("cannot set daemon status of active thread")
        self._daemonic = daemonic
      
    # 判断此线程是否是守护线程
    def isDaemon(self):
        return self.daemon

    #通过方法修改daemonic属性值  不建议使用
    def setDaemon(self, daemonic):
        self.daemon = daemonic
 1 # encoding:utf-8
 2 # Author:"richie"
 3 # Date:8/29/2017
 4 # python线程:线程的调度-守护线程
 5 
 6 from threading import Thread,Timer
 7 import time
 8 
 9 class MyCommon(Thread):
10 
11     def run(self):
12         for i in range(1,5):
13             t = Timer(7, self.print_msg, args=(i,))
14             t.start()
15 
16     def print_msg(self,i):
17         print("线程1第" + str(i) + "次执行!")
18 
19 class MyDaemon(Thread):
20     """
21     守护线程不可以在重新new thread
22     """
23     def run(self):
24         for i in range(9999999):
25             print("后台线程第" + str(i) + "次执行!")
26             time.sleep(2)
27 
28 if __name__ == '__main__':
29     t1 = MyCommon()
30     t2 = MyDaemon()
31     t2.deamon = True # 设置为守护线程  
32     t1.start()
33     t2.start()
D:PythonPython3.6python.exe D:/Python/PythonProgram/day35/案例分析.py
后台线程第0次执行!
后台线程第1次执行!
后台线程第2次执行!
后台线程第3次执行!
线程1第1次执行!
线程1第2次执行!
线程1第3次执行!
线程1第4次执行!

Process finished with exit code 0
从上面的执行结果可以看出:
前台线程是保证执行完毕的,后台线程还没有执行完毕就退出了。
 
实际上:python解释器判断程序是否执行结束的标准是所有的前台执线程行完毕了,而不管后台线程的状态,因此,在使用后台县城时候一定要注意这个问题。
原文地址:https://www.cnblogs.com/richiewlq/p/7447604.html