解决python父线程关闭后子线程不关闭问题
2020-04-26 07:05
106 查看
我们都知道,python可以通过threading module来创建新的线程,然而在创建线程的线程(父线程)关闭之后,相应的子线程可能却没有关闭,这可能是因为代码中没有使用setDaemon(True)函数。
接下来,使用一个例子来说明:
import threading def prt_hello() : while 1 : print 'hello' if __name__ == '__main__' : t = threading.Thread(target=prt_hello) t.setDaemon(True) t.start()
我们需要把setDaemon函数放在start函数前面,不然它是不给通过的,并且返回'cannot set daemon status of active thread‘
补充知识:Python 多线程的退出/停止的一种是实现思路
在使用多线程的过程中,我们知道,python的线程是没有stop/terminate方法的,也就是说它被启动后,你无法再主动去退出它,除非主进程退出了,注意,是主进程,不是线程的父进程.
一个比较合理的方式就是把原因需要放到threading.Thread的target中的线程函数,改写到一个继承类中,下面是一个实现例子
import threading import time import os # 原本需要用来启动的无线循环的函数 def print_thread(): pid = os.getpid() counts = 0 while True: print(f'threading pid: {pid} ran: {counts:04d} s') counts += 1 time.sleep(1) # 把函数放到改写到类的run方法中,便可以通过调用类方法,实现线程的终止 class StoppableThread(threading.Thread): def __init__(self, daemon=None): super(StoppableThread, self).__init__(daemon=daemon) self.__is_running = True self.daemon = daemon def terminate(self): self.__is_running = False def run(self): pid = os.getpid() counts = 0 while self.__is_running: print(f'threading running: {pid} ran: {counts:04d} s') counts += 1 time.sleep(1) def call_thread(): thread = StoppableThread() thread.daemon = True thread.start() pid = os.getpid() counts = 0 for i in range(5): print(f'0 call threading pid: {pid} ran: {counts:04d} s') counts += 2 time.sleep(2) # 主动把线程退出 thread.terminate() if __name__ == '__main__': call_thread() print(f'==========call_thread finish===========') counts = 0 for i in range(5): counts += 1 time.sleep(1) print(f'main thread:{counts:04d} s')
以上这篇解决python父线程关闭后子线程不关闭问题就是小编分享给大家的全部内容了,希望能给大家一个参考
您可能感兴趣的文章:
相关文章推荐
- 快速解决pyqt5窗体关闭后子线程不同时退出的问题
- python父线程关闭后子线程不关闭问题
- 解决手机关闭屏幕线程挂起问题
- 解决SWT因shell关闭导致的线程启动失败问题
- MySQL线程处于Opening tables的问题解决方法
- Extjs4中tab打开,关闭再打开不显示或显示重叠问题的解决方法
- paip.提升用户体验----解决浏览器关闭后自动退出的问题
- Operating System-进程/线程内部通信-信号量、PV操作的实现和应用(解决哲学家进餐和生产者消费者问题)
- 解决J2EE-session在浏览器关闭后失效问题
- FTPClient调用retrieveFileStream导致线程挂起(防火墙问题);下载文件小于实际文件问题解决
- 解决点击空白关闭popupWindow方法过时问题
- 解决FormClosing事件点击关闭2次的问题
- iphone线程中使用异步网络的问题,以及如何用NSRunLoop来解决
- 解决VS10问题: Visual C++ Package Server遇到问题需要关闭。我们对此引起的不便表示抱歉。
- 解决vue代码缩进报错问题 关闭ESlint
- EF(Entity Framework)发生错误”正在创建模型,此时不可使用上下文“的解决办法。 正在创建模型,此时不可使用上下文。如果在 OnModelCreating 方法内使用上下文或如果多个线程同时访问同一上下文实例,可能引发此异常。请注意不保证 DbContext 的实例成员和相关类是线程安全的。 临时解决了这个问题,在Context的构造函数中,禁用了自动初始化:
- 解决多个io流需要关闭而重复嵌套try-catch-finally的问题
- 刷新关闭浏览器调用的onbeforeunload在ie9/10当点击确认easyui的弹出框时,也会调的问题的解决
- 解决“此版本的 SQL Server 不支持用户实例登录标志。该连接将关闭”问题
- 用Python的线程来解决生产者消费问题的示例