欢迎各位兄弟 发布技术文章
这里的技术是共享的
python setDaemon 作用
在 Python 中,setDaemon
方法用于设置线程(threading.Thread
对象)是否为守护线程(Daemon Thread)。守护线程是一种在后台运行的线程,它的主要特点是:当程序的主线程(非守护线程)结束时,不管守护线程是否完成其任务,它们都会立即被强制终止。
setDaemon
方法语法: thread.setDaemon(True)
或 thread.setDaemon(False)
True
表示将线程设置为守护线程。
False
表示将线程设置为非守护线程(默认行为)。
以下是一个简单的示例,展示了如何使用 setDaemon
方法:
python复制代码
import threading import time
def daemon_thread_function(): while True: print("Daemon thread is running") time.sleep(1)
def non_daemon_thread_function(): for i in range(5): print("Non-daemon thread is running") time.sleep(1)
# 创建线程
daemon_thread = threading.Thread(target=daemon_thread_function) non_daemon_thread = threading.Thread(target=non_daemon_thread_function)
# 设置守护线程
daemon_thread.setDaemon(True)
# 启动线程
daemon_thread.start() non_daemon_thread.start()
# 主线程等待非守护线程完成
non_daemon_thread.join()
print("Main thread is exiting")
运行上述代码时,你会看到类似以下的输出:
复制代码
Non-daemon thread is running Daemon thread is running Non-daemon thread is running Daemon thread is running Non-daemon thread is running Non-daemon thread is running Non-daemon thread is running Main thread is exiting
守护线程 (daemon_thread
):
设置为守护线程 (daemon_thread.setDaemon(True)
).
当主线程(运行 non_daemon_thread.join()
的线程)结束时,守护线程 daemon_thread
会立即被终止,即使它还在运行。
非守护线程 (non_daemon_thread
):
默认情况下是非守护线程。
主线程会等待这个非守护线程完成 (non_daemon_thread.join()
).
守护线程通常用于执行后台任务,例如日志记录、状态监控等,这些任务不需要阻止程序退出。
如果程序中没有非守护线程在运行,那么当主线程结束时,程序会立即退出,不管有多少守护线程在运行。
通过合理使用 setDaemon
方法,你可以更好地控制程序的退出行为,确保在需要时能够干净地终止后台任务。
non_daemon_thread.join() 这一句的作用
在 Python 的 threading
模块中,non_daemon_thread.join()
这一句的作用是使主线程(即运行 join()
方法的线程)等待 non_daemon_thread
线程完成其执行。
具体来说,join()
方法是一个同步原语,它会阻塞调用它的线程(在这个例子中是主线程),直到被调用的线程(non_daemon_thread
)终止。这意味着,如果 non_daemon_thread
线程还在运行,主线程会在 join()
方法调用处暂停,直到 non_daemon_thread
完成其任务并退出。
这是多线程编程中常用的一种模式,用于确保某些关键任务(通常是非守护线程执行的任务)在主线程继续执行或程序退出之前完成。
在前面的示例中:
python复制代码non_daemon_thread.join()
这一行确保了主线程会等待 no
n_daemon_thread
线程完成其五次循环打印和休眠操作后,才会继续执行下一行代码(即打印 "Main thread is exiting"
)。
如果没有 join()
方法,主线程可能会立即继续执行并打印 "Main thread is exiting"
,而不会等待 non_daemon_thread
完成。但是,由于 non_daemon_thread
是非守护线程,程序实际上不会立即退出;它会等待所有非守护线程完成后才退出。然而,使用 join()
方法提供了更明确的同步点,并且可以使代码的逻辑更加清晰。
另外,需要注意的是,如果 non_daemon_thread
是一个长时间运行的任务,而主线程不需要等待它完成就可以继续执行其他操作,那么你可能不会调用 join()
方法,或者可能会在一个更合适的时机调用它。但是,在大多数情况下,当你想要确保某个线程在程序继续之前完成其工作时,使用 join()
是正确的做法。