python对于守护进程join , 以及daemon 的使用条件

简介: python对于守护进程join , 以及daemon 的使用条件

对于守护进程daemon , join 的使用条件

daemon属性

  1. daemon 属性:
  • 在创建线程时,可以设置线程的 daemon 属性。如果将一个线程设置为守护线程(daemon=True),则该线程会在主线程结束时自动退出,而不管该守护线程是否完成。
  • 守护线程的作用是在主线程运行时,守护线程也在运行,但主线程结束后,守护线程将被强制退出,不等待它完成。这通常用于执行一些后台任务,如监控或定期清理
import threading
import time
def daemon_thread():
    while True:
        print("Daemon thread is running...")
        time.sleep(1)
daemon_thread = threading.Thread(target=daemon_thread)
daemon_thread.daemon = True  # 设置为守护线程
daemon_thread.start()
time.sleep(3)  # 主线程等待3秒
print("Main thread is exiting.")
  1. 守护进程join
  • join 方法用于等待线程结束。调用线程的 join 方法会阻塞当前线程,直到被调用的线程执行完成。
  • 如果不调用 join,主线程可能在子线程执行完之前就退出。join 用于确保主线程等待所有子线程完成,然后再继续执行。
import threading
import time
def worker():
    time.sleep(2)
    print("Worker thread is done.")
thread = threading.Thread(target=worker)
thread.start()
thread.join()  # 等待子线程执行完成
print("Main thread is exiting.")

所以,daemonjoin 的区别在于:

  • daemon 控制线程是否在主线程退出时自动退出。
  • join 控制主线程是否等待子线程完成后再继续执行。
  1. 等待子线程完成: 当主线程启动了多个子线程,并且主线程需要等待所有子线程都执行完成后再继续执行,就可以使用 join 方法
pythonCopy code
import threading
import time
def worker(name, delay):
    print(f"{name} starts working.")
    time.sleep(delay)
    print(f"{name} finishes working.")
thread1 = threading.Thread(target=worker, args=("Thread 1", 3))
thread2 = threading.Thread(target=worker, args=("Thread 2", 5))
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print("All threads have finished. Main thread exits.")
  1. 线程协同: 在某些情况下,主线程可能需要等待一个子线程执行完成后,将结果传递给另一个子线程。通过 join,可以确保线程的执行顺序。
pythonCopy code
import threading
import time
result = None
def worker1():
    global result
    print("Worker 1 starts working.")
    time.sleep(3)
    result = "Result from Worker 1"
    print("Worker 1 finishes working.")
def worker2():
    global result
    print("Worker 2 starts working.")
    while result is None:
        time.sleep(1)
    print(f"Worker 2 uses result: {result}")
    print("Worker 2 finishes working.")
thread1 = threading.Thread(target=worker1)
thread2 = threading.Thread(target=worker2)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print("All threads have finished. Main thread exits.")
  1. 主线程等待多个子线程的完成: 当有多个子线程时,主线程可以使用 join 逐个等待它们的完成,以确保它们按照预期的顺序执行
pythonCopy code
import threading
import time
def worker(name, delay):
    print(f"{name} starts working.")
    time.sleep(delay)
    print(f"{name} finishes working.")
threads = []
for i in range(5):
    thread = threading.Thread(target=worker, args=(f"Thread {i}", i))
    threads.append(thread)
    thread.start()
for thread in threads:
    thread.join()
print("All threads have finished. Main thread exits.")

总之,join 方法用于线程之间的同步,确保主线程等待所需的子线程执行完成。

相关文章
|
5月前
|
数据库连接 API 数据安全/隐私保护
Python字符串处理:超越split与join的五大高效技巧
本文介绍Python字符串处理的五大高效技巧:strip家族精准去字符、partition分割结构化数据、count统计子串、高级比较方法及正则应用,结合真实案例与性能对比,提升开发效率。
253 0
|
8月前
|
监控 编译器 Python
如何利用Python杀进程并保持驻留后台检测
本教程介绍如何使用Python编写进程监控与杀进程脚本,结合psutil库实现后台驻留、定时检测并强制终止指定进程。内容涵盖基础杀进程、多进程处理、自动退出机制、管理员权限启动及图形界面设计,并提供将脚本打包为exe的方法,适用于需持续清理顽固进程的场景。
|
数据采集 Java 数据处理
Python实用技巧:轻松驾驭多线程与多进程,加速任务执行
在Python编程中,多线程和多进程是提升程序效率的关键工具。多线程适用于I/O密集型任务,如文件读写、网络请求;多进程则适合CPU密集型任务,如科学计算、图像处理。本文详细介绍这两种并发编程方式的基本用法及应用场景,并通过实例代码展示如何使用threading、multiprocessing模块及线程池、进程池来优化程序性能。结合实际案例,帮助读者掌握并发编程技巧,提高程序执行速度和资源利用率。
647 0
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
调度 iOS开发 MacOS
python多进程一文够了!!!
本文介绍了高效编程中的多任务原理及其在Python中的实现。主要内容包括多任务的概念、单核和多核CPU的多任务实现、并发与并行的区别、多任务的实现方式(多进程、多线程、协程等)。详细讲解了进程的概念、使用方法、全局变量在多个子进程中的共享问题、启动大量子进程的方法、进程间通信(队列、字典、列表共享)、生产者消费者模型的实现,以及一个实际案例——抓取斗图网站的图片。通过这些内容,读者可以深入理解多任务编程的原理和实践技巧。
797 1
Python中的多线程与多进程
本文将探讨Python中多线程和多进程的基本概念、使用场景以及实现方式。通过对比分析,我们将了解何时使用多线程或多进程更为合适,并提供一些实用的代码示例来帮助读者更好地理解这两种并发编程技术。
|
数据挖掘 程序员 调度
探索Python的并发编程:线程与进程的实战应用
【10月更文挑战第4天】 本文深入探讨了Python中实现并发编程的两种主要方式——线程和进程,通过对比分析它们的特点、适用场景以及在实际编程中的应用,为读者提供清晰的指导。同时,文章还介绍了一些高级并发模型如协程,并给出了性能优化的建议。
180 3
|
监控 JavaScript 前端开发
python中的线程和进程(一文带你了解)
欢迎来到瑞雨溪的博客,这里是一位热爱JavaScript和Vue的大一学生分享技术心得的地方。如果你从我的文章中有所收获,欢迎关注我,我将持续更新更多优质内容,你的支持是我前进的动力!🎉🎉🎉
221 0
|
存储 Python
Python中的多进程通信实践指南
Python中的多进程通信实践指南
265 0
|
数据采集 消息中间件 Python
Python爬虫-进程间通信
Python爬虫-进程间通信
130 0

推荐镜像

更多