跳至内容
Python

Python time.sleep() 函数

在本教程中,您将了解 time.sleep() 函数的工作方式,以及如何在程序中应用它。
Sejal Jaiswal's photo
Sejal Jaiswal
已更新 · 7分钟 阅读

使用 AI 探索

ChatGPTClaudePerplexity

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续
继续操作即表示您接受我们的《使用条款》和《隐私政策》,并同意您的数据存储在美国。

在本教程中,您将学习 Python 中的 sleep() 函数,它可以让您的程序在执行过程中引入延迟。这是一个非常实用的函数,尤其是在程序使用线程、或处理图形与动画时。sleep 函数位于 time 模块中,该模块还包含许多与时间访问和转换相关的函数。尽管该模块在所有平台上都可用,但其中的函数不一定都可用,或其工作方式不一定完全相同。下面我们来更详细地了解一下 time.sleep() 模块……

Time 模块

该模块提供了一组用于在程序中操作时间的函数。还有一些与之“同类”的模块专门处理系统中的日期和日历,但这个模块更侧重于对时间本身的操作——从小时一直到毫秒的粒度。

在计算机科学领域中处理时间时,您通常会听到一个术语:epoch(纪元)。

首先,请确保导入 time 模块。只需输入:

import time

epoch(纪元)

这是时间“真正开始”的那个精确时刻。这并不是指太阳系的诞生,也不是人类开始计时的时刻,而是离现在相对更近的一个时间点。对于 UNIX 系统,epoch 是 1970 年 1 月 1 日 00:00:00(UTC)(如果您好奇的话,那天是星期四)。要查询您系统的 epoch,您可以输入:

time.gmtime(0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

这会告诉您年份(tm_year)、月份(tm_mon)、日期(tm_mday)、小时(tm_hour)、分钟(tm_min)以及秒(tm_sec)。还有一周中的第几天(tm_wday)——这里为 3,因为一周以周一为起始,计为 0。接着是当年的第几天(tm_yday),也叫儒略日。最后是夏令时标志(tm_isdst)——DST 指夏令时。该字段的取值为 0、-1 或 1。0 表示未实行夏令时,1 表示正在实行夏令时,-1 表示信息不可用。为何会不可用?因为夏令时规则由当地法律决定,并且可能发生变化。

大多数计算机将日期和时间存储为从 1970 年 1 月 1 日 00:00:00(UTC)到待存储时间点之间的秒数差。因此,如果您输入:

time.time()
1548611182.872067

这会告诉您自 1970 年 1 月 1 日 00:00:00(UTC)以来已经过去了多少秒。这个差值就是我们所说的时间戳或 UNIX 纪元时间,它是一个浮点数。嗯……严格来说,这个差值并不是以秒为单位,而是以所谓的 tick(滴答) 为单位。在大多数 UNIX 系统中,时钟每秒“滴答”50 到 100 次。因此,UNIX 纪元时间实际上是自 1970 年 1 月 1 日 00:00:00 UTC 以来发生的滴答次数。

现在您已经了解了 time 模块的大致作用。接下来看看 sleep() 函数。

time.sleep()

简单而言,time.sleep() 接收的参数是您希望程序暂停(或挂起)多少秒,然后再继续执行下一步。我们通过一个简单程序来看看它的效果:程序每次输出当前时间,并在下一次执行前暂停 5 秒——因此每次打印当前时间之间会相差 5 秒。使用 time.ctime() 可以以较为友好的格式查看本地时间。

for count in range(5):
    print(time.ctime())
    # Prints the current time with a five second difference
    time.sleep(5)
Sun Jan 27 18:46:24 2019
Sun Jan 27 18:46:29 2019
Sun Jan 27 18:46:34 2019
Sun Jan 27 18:46:39 2019
Sun Jan 27 18:46:44 2019

该函数的语法为:time.sleep(sec),其中 sec 为指定程序暂停的秒数。该函数不返回任何值。

sec —— 该参数实际上是一个浮点数,因此您可以更精确地控制睡眠时间。不过,这一点存在不确定性,因为实际挂起时间可能比请求的时间更短,或随意地更长。为便于理解,可以把程序想象成店里由不同销售人员处理的一个问题或任务——当您让程序暂停时,正在处理的那位立刻被分配给了其他客户。但很快(甚至比指定的睡眠秒数更早),另一位空闲的销售人员接手并完成了任务——因此挂起时间可能更短。类似地,由于店内所有销售人员的任务调度,挂起时间也可能比请求的更长,程序需要等待轮到自己。当然,内部实现要复杂得多,处理这种情况的方法也已经有了不少。

for count in range(3):
    print(time.ctime())
    # Prints the current time with a five second difference
    time.sleep(2.5)
Sun Jan 27 18:46:49 2019
Sun Jan 27 18:46:52 2019
Sun Jan 27 18:46:54 2019

Python 并不对该函数调用的行为作出保证,尤其是在跨平台情况下。根本原因在于该模块中大多数函数会调用同名的平台 C 标准库函数。其准确性实际上取决于底层操作系统的睡眠精度;如需进一步了解,最好查阅对应平台的文档,因为这些函数在不同平台上的语义有所不同。

不过也有一个好消息:从 Python 3.5 开始,即使睡眠被信号中断(仍以上文中的“销售人员”作类比),time.sleep(secs) 现在也会至少睡满传入的 secs(参数值),除非信号处理程序抛出异常。

那么,使用 time.sleep() 时内部发生了什么?
本段旨在帮助您更好地理解该函数,但并非使用该函数的前置要求。该函数实际上使用的是系统时钟,这是一种位于处理器中的电子设备,会发出稳定的高频信号以同步所有内部组件。该模块会以可编程的时间间隔触发所谓的中断请求(IRQ)。IRQ 负责中断处理器正在执行的代码,保存当前状态,然后将控制权交给操作系统中的另一段代码。
因此,sleep() 函数的做法是调用底层的 I/O 完成例程或异步过程调用来阻塞进程。操作系统会记录您在超时时间到达之前不需要执行其他操作。一旦超时到达,操作系统会从上次记忆的状态恢复您的进程。而从您的角度来看,这只是一句对 time.sleep() 的简单调用。

恭喜您掌握了 time.sleep() 函数。欢迎查看 DataCamp 的 Python Data Science Toolbox(第 1 部分) 课程,进一步学习 Python 中的函数。

主题
Python

进一步了解 Python

课程

Python 入门

4 小时
7.1M
只需 4 小时就能掌握 Python 数据分析基础知识。 本在线课程将介绍 Python 接口并探索常用包。
查看详情开始课程

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续
继续操作即表示您接受我们的《使用条款》和《隐私政策》,并同意您的数据存储在美国。
查看更多