守护线程&&threading.enumerate()

复制代码
'''
在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)等来管理和控制线程的执行。

posted @   Allen_Hao  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
点击右上角即可分享
微信分享提示