python3中Thread.setDeamon的使用

it2022-05-05  203

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


最新回复(0)