首页 > 其他分享 >守护线程

守护线程

时间:2023-07-28 23:45:03浏览次数:25  
标签:daemon Thread thread threading 线程 守护

'''
在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

相关文章

  • 线程安全(二)
    线程是计算机中执行代码的最小单位,是进程中的一条执行路径。一个进程可以包含多个线程,每个线程独立执行自己的代码,但它们共享进程的资源,如内存空间、文件和网络连接等。线程的使用可以提高程序的并发性和响应性。在多线程编程中,可以同时执行多个任务,提高程序的执行效率。每个线程......
  • 多线程
    多线程实现的几种方式1.继承Thread类,重写run方法。2.实现Runnable,实现run方法。3.实现Callable接口。4.实现有返回结果的线程,使用ExecutorService、Callable、Future实现返回结果的线程。附带学习地址:https://www.php.cn/faq/543054.html......
  • 线程池学习
    具体文章见: Java线程池实现原理及其在美团业务中的实践线程池好处降低资源消耗提高响应速度提高线程的可管理性提供更多更强大的功能线程池解决的问题频繁申请、销毁资源和调度资源,将地阿莱额外的消耗,可能会非常巨大。对资源无限申请缺少抑制手段,易引发系统资源耗尽的......
  • 实现多线程多任务的步骤
    步骤 1.导入线程模块importthreading2.创建子线程并指定执行的任务sub_thread=threading.Thread(target=任务名3.启动线程执行任务sub_thread.start() 示例1'''2在Python中,实现多线程多任务可以通过使用threading模块来创建和管理线程34最佳实践:......
  • 通过 Javacore 诊断线程挂起等性能问题
    Javacore与WebSphereCommerce性能问题近年来,依据WebSphereCommerce(以下简称为WC)搭建的电子商务网站系统日益增多。由于系统本身的复杂性,一旦系统出现问题,尤其是性能问题,问题诊断和定位就会非常困难。下图所示为由WC系统为核心搭建的电子商务网站的一般逻辑架构,如图......
  • Android多线程及异步处理问题
    1、问题提出1)为何需要多线程?2)多线程如何实现?3)多线程机制的核心是啥?4)到底有多少种实现方式?2、问题分析1)究其为啥需要多线程的本质就是异步处理,直观一点说就是不要让用户感觉到“很卡”。eg:你点击按钮下载一首歌,......
  • java——虚拟机、线程
    java虚拟机:是一台想象中的机器,有自己想象的硬件(处理器、堆栈、寄存器等)以及相应的指令系统。生命周期:当执行java程序时,虚拟机开始运行,程序结束虚拟机停止。同一台计算机每多运行一个程序,就会多运行一个虚拟机。虚拟机开始于main()方法。java虚拟机的体系结构:......
  • java多线程学习-java.util.concurrent详解
    java多线程学习-java.util.concurrent详解(一)Latch/Barrier   Java1.5提供了一个非常高效实用的多线程包:java.util.concurrent,提供了大量高级工具,可以帮助开发者编写高效、易维护、结构清晰的Java多线程程序。从这篇blog起,我将跟大家一起共同学习这些新的Java多线......
  • 进程、线程与协程:并发执行的三种重要概念与应用
    在计算机科学中,进程、线程和协程是实现并发执行的三种重要概念。它们是计算机系统中的核心组成部分,为多任务处理和资源共享提供了有效的解决方案。本文将深入探讨进程、线程和协程的概念、特点及它们在并发编程和系统设计中的应用,帮助读者全面理解并发执行的原理和实践。进程的概念......
  • 三个线程循环打印ABC10次的几种解决方法
    有三个线程分别打印A、B、C,请用多线程编程实现,在屏幕上循环打印10次ABCABC… 这是一个比较常用的关于线程的考题,一般出现在应届生的校园招聘试卷上。本文给出如下四种解决方法:使用synchronized,wait和notifyAll使用Lock和Condition使用Semaphore使用AtomicInteger使用synchro......