守护线程&&threading.enumerate()
1.创建进程2.Process类语法详解3.进程间通信4.进程池5.进程间的锁和信号量6.根据进程编号杀死指定进程os.kill7.守护进程8.线程9.实现多线程多任务的步骤10.threading.Thread类详解
11.守护线程&&threading.enumerate()
12.python线程并行执行与java的线程并行执行的对比13.IO密集型任务与CPU密集型任务14.多线程共享全局变量的问题15.多线程共享资源之竞态条件16.互斥锁17.死锁18.线程池19.进程与线程的对比20.闭包21.闭包之nonlocal关键字的作用22.闭包之作用23.闭包之可能引起的问题24.弱引用25.装饰器26.装饰器示例27.property 属性28.with语句和上下文管理器详解、最佳实践、示例29.生成器30.深浅拷贝31.正则表达式''' 在Python中,使用threading.Thread类创建守护线程可以通过设置daemon参数为True来实现。 守护线程是一种特殊的线程,它会随着主线程的结束而自动退出(守护线程会随着主线程的结束而自动退出。因此,如果主线程先结束,守护线程也会立即退出,无论守护线程是否执行完成。),无需手动调用join()方法等待守护线程执行完成。 最佳实践: 1. 在创建threading.Thread对象之前将daemon参数设置为True,确保线程启动之前就被标记为守护线程。 2. 当所有非守护线程都结束时,Python解释器会检查是否还有活动的守护线程。如果只剩下守护线程,Python解释器会直接退出程序,不会等待守护线程执行完成。 3. 尽量避免在守护线程中进行耗时的操作或阻塞式的I/O操作,因为守护线程会在主线程结束时立即退出,可能导致未完成的操作被中断(资源未释放)。 4. 如果守护线程需要与其他线程进行通信或共享数据,应该使用适当的线程同步机制,如锁(Lock)、条件变量(Condition)等。 ''' import threading import time def task(): while True: print("Daemon thread is running") time.sleep(1) def main(): # 方式1: 创建线程时指定为守护进程 daemon_thread = threading.Thread(target=task, daemon=True) # 方式2: 创建线程后,通过线程的daemon属性为True设置为守护线程 # daemon_thread = threading.Thread(target=task) # daemon_thread.daemon = True # 设置守护线程 daemon_thread.start() time.sleep(5) # 主线程等待5秒 print("Main thread finished")
输出:
1 2 3 4 5 6 | Daemon thread is running Daemon thread is running Daemon thread is running Daemon thread is running Daemon thread is running Main thread finished |
1 ''' 2 threading.enumerate() 获取当前所有活跃的线程对象列表。使用 len() 对列表求长度可以看到当前活跃的线程的个数 3 主线程可以不断判断活跃线程个数,如果个数小于等于1,说明其它线程已经执行完成 4 ''' 5 import threading 6 import time 7 8 9 def task(): 10 print("Thread started") 11 time.sleep(2) 12 print("Thread finished") 13 14 15 def main(): 16 thread1 = threading.Thread(target=task) 17 thread2 = threading.Thread(target=task) 18 19 thread1.start() 20 thread2.start() 21 22 while True: 23 active_threads = threading.enumerate() 24 if len(active_threads) <= 1: 25 break 26 27 time.sleep(1) 28 29 print("All threads completed") 30 31 32 if __name__ == "__main__": 33 main()
在上述示例中,定义了一个任务函数task()
,它模拟了一个耗时操作。在main()
函数中,我们创建了两个线程并启动它们。然后,在一个无限循环中,我们不断地调用threading.enumerate()
函数获取当前活跃的线程列表,并使用len()
函数计算列表的长度。如果活跃线程的个数小于等于1(只剩下主线程),说明其他线程已经执行完成,那么就退出循环,输出"All threads completed"表示所有线程都已经完成。
请注意,由于GIL的存在,Python中的多线程并不能真正实现并行运行,因此在实际应用中,你可能会使用更高级的抽象,如线程池(ThreadPoolExecutor)、队列(Queue)、事件(Event)等来管理和控制线程的执行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能