''' 在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")
输出:
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)等来管理和控制线程的执行。
标签:daemon,Thread,thread,threading,线程,守护 From: https://www.cnblogs.com/allenxx/p/17589151.html