Python 线程计时器

17 Mar 2025 | 5 分钟阅读

在 Python 中,threading 模块允许开发人员在单个程序中创建多个线程,从而实现多个任务的并行执行。threading 模块还提供了一个 Timer 类,可用于在指定时间过去后安排任务运行。在本文中,我们将解释如何使用 threading.timer 类来安排 Python 程序中的任务。

理解 threading 模块中的 Threading Timer 类。Timer 类提供了一种方法,可以在指定时间过去后安排函数运行。Timer 类接受两个参数:延迟时间(以秒为单位)和要执行的函数。启动 Timer 对象时,它会等待指定的时间,然后运行指定的函数。

语法

在上面的语法中,delay 是以秒为单位的延迟时间,function 是要执行的函数。

创建 Timer 对象后,程序员可以使用 start() 方法启动它。然后,Timer 对象将在指定的延迟后运行指定的函数。

示例 1:一个简单的定时器

以下是一个简单的 Timer 示例,它会在指定延迟后打印一条消息

代码

输出

Python Threading Timer

说明

代码成功运行后,它将等待 5 秒钟,然后在控制台打印“Hello, world!”。这是因为 print_message() 函数被安排为由 Timer 线程在 5 秒延迟后调用。

示例 2:重复定时器

Timer 类也可用于创建重复定时器,这些定时器以固定的间隔执行函数。要创建重复定时器,程序员可以使用 Timer 类以及 while 循环。下面是一个每 2 秒重复调用一次函数的 Timer 示例

代码

输出

Python Threading Timer

注意:它会每 2 秒连续打印“Hello, world!”,直到程序被手动终止。

说明

上述代码首先创建一个 Timer 对象 t,延迟时间为 2 秒(即 threading.Timer(2.0, print_message))。这意味着 2 秒后,print_message() 函数将在单独的线程中执行。

然后启动 while 循环,并在循环中使用 t.start() 启动 t 定时器,这会安排 print_message() 函数在 2 秒延迟后运行。t.join() 调用会阻塞主线程,直到 print_message() 函数执行完毕。

print_message() 函数完成后,将创建一个新的 Timer 对象并将其重新赋值给 t,延迟时间仍然为 2 秒。这创建了一个循环,该循环会无限期地安排 print_message() 函数每 2 秒运行一次,直到程序被手动终止。

if not threading.active_count() > 1: 这是一个检查条件,用于在除主线程之外没有其他活动线程时跳出循环并终止程序。这样做是为了防止程序无限期运行并导致“Hello, world!”消息的无休止循环。

示例 3:取消定时器

有时程序员可能希望在 Timer 完成其延迟之前取消它。在这种情况下,程序员可以使用 Timer 对象的 cancel() 方法来执行此操作。这是一个 Timer 示例,它在执行其函数之前被取消

代码

输出

由于定时器在执行之前被取消,因此不会打印任何输出

说明

上述代码从 threading 模块创建了一个 Timer 对象,该模块是一个允许在一定延迟后安排函数运行的类。Timer 的延迟时间设置为 5.0 秒,print_message() 函数是要执行的函数。

使用 t.start() 启动定时器后,定时器将等待 5.0 秒,然后执行 print_message() 函数,该函数仅打印“Hello, world!”。

但是,在启动定时器后立即调用 t.cancel(),这会在函数执行之前取消定时器。结果,将不会打印任何输出,并且程序将在没有进一步操作的情况下终止。

Timer 线程的好处

Python threading.Timer 类为需要在 Python 程序中安排任务的开发人员提供了多种好处

  1. 异步执行:使用 Timer 类,程序员可以安排任务异步运行,使程序在后台任务运行时继续执行。
  2. 精确计时:Timer 类允许程序员以精确的时间间隔执行任务,这对于需要计时精度的应用程序很有用。
  3. 重复定时器:Timer 类可用于创建重复定时器,这些定时器以固定的间隔执行函数,消除了重复编码的需要。
  4. 取消:Timer 类提供了一种在 Timer 完成其延迟之前取消它的方法,从而可以更好地控制应用程序的计时逻辑。

Python 线程定时器的缺点

使用 Python 线程定时器也有一些缺点。它们如下。

  1. 资源消耗:每当我们尝试创建新的 Timer 对象时,都会创建一个新线程,这会消耗系统资源。如果程序员同时运行许多 Timer,它可能会影响程序的性能和内存使用。
  2. 精度有限:Timer 类依赖于系统时钟,该时钟可能无法为某些应用程序提供所需的精度。例如,如果应用程序需要亚毫秒级的计时精度,则 Timer 类可能不够。
  3. 复杂性:虽然 Timer 类对于简单情况相对容易使用,但在更复杂的计时场景中使用时,它可能会变得复杂。需要正确使用循环等控制结构来创建复杂的调度逻辑。
  4. 调试:调试多线程程序可能很困难。如果程序员不熟悉 Timer 类的工作方式,则调试使用 Timer 类的程序可能尤其困难。

结论

Python 的 threading 模块提供了一种在单个程序中创建多个线程的强大方法,从而实现了多个任务的并行执行。threading 模块中的 Timer 类是安排任务在指定延迟后运行的有用工具。使用 Timer 类、循环和其他控制结构,程序员可以创建复杂的调度逻辑,以精确的时间间隔执行函数。


下一主题Python TOML