语法:
obj.setDaemon(True)
个人理解:
* 需要在start之前使用
* 主线程被创建时默认为False,所以子线程要设置时需要手动设置
* Daemon意思为守护线程,用来回收线程,当主线程运行结束时,会被子线程杀死
setDaemon()
Old API for daemon.
A boolean value indicating whether this thread is a daemon thread (True) or not (False). This must be set before start() is called, otherwise RuntimeError is raised. Its initial value is inherited from the creating thread; the main thread is not a daemon thread and therefore all threads created in the main thread default to daemon = False.
The entire Python program exits when no alive non-daemon threads are left.
即是:
setDaemon(True)将线程声明为守护线程,必须在start() 方法调用之前设置,如果不设置为守护线程程序会被无限挂起。当没有存活的非守护进程时,整个python程序才会退出。
总结:
如果主线程执行完以后,还有其他非守护线程,主线程是不会退出的,会被无限挂起;必须将线程声明为守护线程之后,如果队列中的数据运行完了,那么整个程序想什么时候退出就退出,不用等待。
from socket import *
from threading import *
import sys
#主线程接收请求
addr = ('0.0.0.0',8888)
sockfd = socket()
sockfd.bind(addr)
sockfd.listen(5)
while True:
#创建子线程用来处理请求
try:
connfd,addr = sockfd.accept()
except KeyboardInterrupt:
#有异常则关闭套接字和父进程
sockfd.close()
sys.exit('服务器退出')
#创建子线程并处理请求
client_thread = Thread(target = handler,args = (connfd,))
#设置子线程为守护线程,在主线程退出时自动退出
client_thread.setDeamon(True)
client_thread.start()
def handler(connfd):
#线程处理函数
pass
参考:https://bbs.csdn.net/topics/80298851