文本介绍了Python多线程中的守护线程使用方法。
Python守护线程简介
在 Python 中,每个程序至少有一个线程,称为主线程。要创建一个具有多个线程的程序,可以使用线程模块。通过使用多个线程,可以并发执行任务。
有时,可能希望在后台执行任务。为此,可以使用一种称为守护线程的特殊线程。
根据定义,守护线程是后台线程。换句话说,守护线程在后台执行任务。
守护线程有助于执行程序中支持非守护线程的任务。例如:
- 在后台将信息记录到文件中。
- 在后台从网站中删除内容。
- 在后台自动将数据保存到数据库中。
创建守护线程
要创建守护线程,可以在Thread
构造函数中将daemon
设置为True
:
<span style="background-color:#f8f8f8"><span style="color:#212529"><code class="language-python">t = Thread(target=f, deamon=<span style="color:#6cb6ff">True</span>)</code></span></span>
或者,可以在创建Thread
的实例后将daemon
属性设置为True
:
t = Thread(target=f) |
|
t.deamon = True |
守护线程示例
下面的例子展示了如何创建一个非守护线程来显示程序等待的秒数:
from threading import Thread |
|
import time |
|
def show_timer(): |
|
count = 0 |
|
while True: |
|
count += 1 |
|
time.sleep(1) |
|
print(f'Has been waiting for {count} second(s)...') |
|
t = Thread(target=show_timer) |
|
t.start() |
|
answer = input('Do you want to exit?\n') |
首先,定义一个函数show_timer()
来显示程序等待的秒数。
其次,创建一个执行show_timer()
函数的新线程:
<span style="background-color:#f8f8f8"><span style="color:#212529"><code class="language-python">t = Thread(target=show_timer)</code></span></span>
三、启动线程:
<span style="background-color:#f8f8f8"><span style="color:#212529"><code class="language-python">t.start()</code></span></span>
最后调用input()
提示用户输入的函数:
<span style="background-color:#f8f8f8"><span style="color:#212529"><code class="language-python">answer = <span style="color:#f69d50">input</span>(<span style="color:#96d0ff">'Do you want to exit?\n'</span>)</code></span></span>
如果运行该程序,它将显示以下输出并永远运行。
Do you want to exit?Has been waiting for 1 second(s)... |
|
Has been waiting for 2 second(s)... |
|
Has been waiting for 3 second(s)... |
|
Has been waiting for 4 second(s)... |
|
Y |
|
Has been waiting for 5 second(s)... |
|
Has been waiting for 6 second(s)... |
要终止程序,需要终止终端。
该程序无限期运行,因为该线程t
是非守护线程,该程序需要等待所有非守护线程完成才能退出。
现在,让我们把线程变成守护线程:
from threading import Thread |
|
import time |
|
def show_timer(): |
|
count = 0 |
|
while True: |
|
count += 1 |
|
time.sleep(1) |
|
print(f'Has been waiting for {count} second(s)...') |
|
t = Thread(target=show_timer, daemon=True) |
|
t.start() |
|
answer = input('Do you want to exit?\n') |
如果您运行该程序,输入一些内容,然后按回车键,该程序将终止。例如:
Do you want to exit? |
|
Has been waiting for 1 second(s)... |
|
Y |
程序终止是因为它不需要等待守护线程完成。此外,守护线程在程序退出时自动终止。
守护线程与非守护线程
下表说明了守护线程和非守护线程之间的区别:
守护线程 | 非守护线程 | |
---|---|---|
线程创建 | t = Thread(target=f, daemon=True) |
t = Thread(target=f) |
程序退出前需要等待 | 否 | 是 |
任务种类 | 非重要任务 | 重要任务 |
概括
- 守护线程是后台线程。
- 守护线程对于执行不重要的任务很有用。
- 程序可以退出,不需要等待守护线程完成。
- 当程序退出时,守护线程会自动终止。