在 Python 中使用 time.sleep() 暂停执行

呼唤time.sleep()是将 Python 代码暂停一定秒数的最快方法。对于异步代码,请使用asyncio.sleep(),并且对于线程或 GUI 更喜欢非阻塞等待,以便您的应用程序保持响应。

选项 1:在同步代码中使用 time.sleep()

步骤一:导入时间模块。

import time

步骤2:通过调用暂停执行time.sleep(seconds).

print("Starting...")
time.sleep(2)  # sleep for 2 seconds
print("Done.")

步骤3:传递一个 float 来睡眠亚秒级延迟。

time.sleep(0.1)  # 100 milliseconds

第4步:在循环内插入睡眠以限制速率工作,例如轮询或 API 调用。

for _ in range(5):
    print("Tick")
    time.sleep(1)

第5步:避免打电话time.sleep()在 GUI 的主线程中或异步事件循环内;使用以下选项来防止冻结。


选项 2:在异步函数中使用 asyncio.sleep()

步骤一:定义一个等待的异步函数asyncio.sleep()而不是阻塞。

import asyncio

async def work():
    print("Hello ...")
    await asyncio.sleep(1)
    print("... world!")

步骤2:运行协程asyncio.run()因此事件循环在等待时保持响应。

asyncio.run(work())

步骤3:安排多个任务同时等待以获得更好的吞吐量。

import asyncio

async def step(name, delay):
    await asyncio.sleep(delay)
    print(f"{name} done")

async def main():
    t1 = asyncio.create_task(step("A", 1))
    t2 = asyncio.create_task(step("B", 2))
    t3 = asyncio.create_task(step("C", 3))
    await t1
    await t2
    await t3

asyncio.run(main())

选项 3:使用 Event.wait() 来响应线程延迟

对于线程,等待事件可以立即关闭并避免等待阻塞睡眠完成。查看事件对象文档.

步骤一:创建一个threading.Event()工作线程可以等待超时。

import threading
import time

stop = threading.Event()

步骤2:在每个工人中,更换time.sleep()和stop.wait(timeout)因此线程在收到信号时可以立即退出。

def worker():
    while not stop.is_set():
        print("working...")
        # Wait up to 1s, but return early if stop is set
        stop.wait(1)

步骤3:启动工作线程并设置事件以干净地停止它。

t = threading.Thread(target=worker, name="worker-1")
t.start()
time.sleep(3)
stop.set()
t.join()

选项 4:在 Tkinter 中安排延迟而不冻结 UI

在 Tkinter 中,使用小部件的after(ms, callback)稍后运行代码而不阻塞事件循环的方法。 Tkinter 中列出了方法文档.

步骤一:创建根窗口和您需要的任何 UI。

import tkinter as tk

root = tk.Tk()
root.geometry("300x150")

步骤2:安排回调root.after(delay_ms, func)而不是使用time.sleep().

def delayed():
    print("Ran after 2 seconds")

root.after(2000, delayed)

步骤3:启动事件循环,以便 UI 在等待时保持交互。

root.mainloop()

快速提示

  • time.sleep()仅阻塞当前线程;其他线程继续运行。
  • 例如,使用浮点数表示秒的小数部分time.sleep(0.25).
  • 更喜欢asyncio.sleep()里面的异步代码和Event.wait()在线程服务中用于快速关闭。
  • 在 GUI 应用程序中,使用计时器安排工作(例如,Tkinterafter)以防止窗户结冰。

选择与您的运行时匹配的睡眠原语:同步、异步、基于线程或 GUI。您将获得所需的延迟,而不会阻塞应用程序中必须保持响应的部分。