python3中Thread.setDeamon的使用

  • setDaemon
语法:
	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程序才会退出。

总结:
	如果主线程执行完以后,还有其他非守护线程,主线程是不会退出的,会被无限挂起;必须将线程声明为守护线程之后,如果队列中的数据运行完了,那么整个程序想什么时候退出就退出,不用等待。
  • 代码实例:在tcp套接字多线程并发的示例
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

你可能感兴趣的:(python,thread)