Python多线程中守护线程使用教程

文本介绍了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)
程序退出前需要等待
任务种类 非重要任务 重要任务

概括

  • 守护线程是后台线程。
  • 守护线程对于执行不重要的任务很有用。
  • 程序可以退出,不需要等待守护线程完成。
  • 当程序退出时,守护线程会自动终止。

猜你喜欢

转载自blog.csdn.net/qq_41221596/article/details/131616980
今日推荐