Python 睡眠函數:如何為代碼添加延遲
已發表: 2022-12-01本教程將教您如何使用 Python 內置時間模塊中的 sleep() 函數為代碼添加時間延遲。
當您運行一個簡單的 Python 程序時,代碼執行是按順序發生的——一條語句接一條語句——沒有任何時間延遲。 但是,在某些情況下您可能需要延遲代碼的執行。 Python 內置時間模塊中的sleep()
函數可以幫助您做到這一點。
在本教程中,您將學習在 Python 中使用sleep()
函數的語法和幾個示例以了解其工作原理。 讓我們開始吧!
Python time.sleep() 的語法
內置於 Python 標準庫中的time
模塊提供了幾個有用的與時間相關的函數。 第一步,將time
模塊導入您的工作環境:
import time
由於sleep()
函數是time
模塊的一部分,您現在可以通過以下通用語法訪問和使用它:
time.sleep(n)
這裡, n
是睡眠的秒數。 它可以是整數或浮點數。
有時所需的延遲可能是幾毫秒。 在這些情況下,您可以將以毫秒為單位的持續時間轉換為秒,並在調用睡眠函數時使用它。 例如,如果要引入 100 毫秒的延遲,可以將其指定為 0.1 秒: time.sleep(0.1)
。
您還可以僅從time
模塊導入sleep
功能:
from time import sleep
如果您使用上述方法進行導入,則可以直接調用sleep()
函數——無需使用time.sleep()
。
現在您已經了解了 Python sleep()
函數的語法,讓我們編寫示例代碼以查看該函數的運行情況。 您可以從此 GitHub 存儲庫中的 python-sleep 文件夾下載本教程中使用的 Python 腳本。
使用 sleep() 延遲代碼執行
作為第一個示例,讓我們使用 sleep 函數來延遲執行一個簡單的 Python 程序。

在以下代碼片段中:
- 第一個
print()
語句立即執行。 - 然後我們使用
sleep()
函數引入 5 秒的延遲。 - 第二個
print()
語句將僅在睡眠操作完成後執行。
# /python-sleep/simple_example.py import time print("Print now") time.sleep(5) print("Print after sleeping for 5 seconds")
現在運行simple_example.py
文件並觀察輸出:
$ python3 simple_example.py
向代碼塊添加不同的延遲
在前面的示例中,我們在執行兩個print()
語句之間引入了 5 秒的固定延遲。 接下來,讓我們編寫另一個示例,以在循環遍歷可迭代對象時引入不同的延遲時間。
在這個例子中,我們想做以下事情:
- 遍歷一個句子,訪問每個單詞,然後打印出來。
- 打印出每個單詞後,我們希望等待一段特定的時間——然後再打印出句子中的下一個單詞。
循環遍歷一串字符串
考慮字符串sentence
。 它是一個字符串,其中每個單詞本身就是一個字符串。
如果我們遍歷字符串,我們將得到每個字符,如下所示:
>>> sentence = "How long will this take?" >>> for char in sentence: ... print(char) # Output (truncated for readability) H o w . . . t a k e ?
但這不是我們想要的。 我們想遍歷句子並訪問每個單詞。 為此,我們可以在sentence
字符串上調用split()
方法。 這將返回一個字符串列表——通過拆分sentence
字符串獲得——包含所有出現的空格。
>>> sentence.split() ['How', 'long', 'will', 'this', 'take?'] >>> for word in sentence.split(): ... print(word) # Output How long will this take?
循環遍歷具有不同延遲的可迭代對象
讓我們重溫一下這個例子:
-
sentence
是我們想要循環訪問每個單詞的字符串。 -
delay_times
是我們將在每次循環期間用作sleep()
函數參數的延遲時間列表。
這裡我們想同時循環遍歷兩個列表: delay_times
列表和拆分sentence
字符串得到的字符串列表。 您可以使用zip()
函數來執行此並行迭代。
Python zip() 函數:zip(list1, list2) 返回一個元組迭代器,其中每個元組包含 list1 和 list2 中索引 i 處的項目。
# /python-sleep/delay_times.py import time sleep_times = [3,4,1.5,2,0.75] sentence = "How long will this take?" for sleep_time,word in zip(sleep_times,sentence.split()): print(word) time.sleep(sleep_time)
如果沒有睡眠功能,控件將立即進行下一次迭代。 因為我們引入了延遲,下一次循環只有在睡眠操作完成後才會發生。
現在運行delay_times.py
並觀察輸出:
$ python3 delay_times.py
字符串中的後續單詞將在延遲後打印出來。 打印出字符串中索引i
處的單詞後的延遲是delay_times
列表中索引i
處的數字。
Python 中的倒數計時器
作為下一個示例,讓我們用 Python 編寫一個簡單的倒數計時器。


讓我們定義一個函數countDown()
:
# /python-sleep/countdown.py import time def countDown(n): for i in range(n,-1,-1): if i==0: print("Ready to go!") else: print(i) time.sleep(1)
接下來我們來解析countDown()
函數的定義:
- 該函數接受一個數字
n
作為參數,並從該數字n
開始倒數至零。 - 我們使用 time.sleep(1) 在計數之間實現一秒的延遲。
- 當計數達到 0 時,該函數打印出“Ready to go!”。
為了實現倒計時操作,我們使用了負步長值為 -1 的
range()
函數。range(n, -1, -1)
將幫助我們遍歷 n、n – 1、n – 2 中的數字範圍,依此類推直到零。 回想一下,在使用range()
函數時,終點默認被排除在外。
接下來讓我們以 5 作為參數添加對countDown()
函數的調用。
countDown(5)
現在運行腳本countdown.py
並查看countDown
函數的運行情況!
$ python3 countdown.py
多線程中的休眠函數
Python 線程模塊提供開箱即用的多線程功能。 在 Python 中,全局解釋器鎖或 GIL 確保在任何時間點只有一個活動線程在運行。

但是,在I/O操作和睡眠等等待操作期間,處理器可以暫停當前線程的執行,切換到另一個正在等待的線程。
為了理解這是如何工作的,讓我們舉個例子。
在 Python 中創建和運行線程
考慮以下函數func1()
、 func2()
和func3()
。 他們循環遍歷一系列數字並將它們打印出來。 這之後是一個睡眠操作——持續特定的秒數——在每次循環過程中。 我們為每個函數使用了不同的延遲時間,以更好地理解執行如何在線程之間並發切換。
import time def func1(): for i in range(5): print(f"Running t1, print {i}.") time.sleep(2) def func2(): for i in range(5): print(f"Running t2, print {i}.") time.sleep(1) def func3(): for i in range(4): print(f"Running t3, print {i}.") time.sleep(0.5)
在 Python 中,您可以使用Thread()
構造函數來實例化線程對象。 使用語法threading.Thread(target = …, args = …)
創建一個線程,該線程使用args
元組中指定的參數運行target
函數。
在此示例中,函數func1
、 func2
和func3
不接受任何參數。 所以只指定函數的名稱作為目標就足夠了。 然後,我們分別以func1
、 func2
和func3
為目標定義線程對象t1
、 t2
和t3
。
t1 = threading.Thread(target=func1) t2 = threading.Thread(target=func2) t3 = threading.Thread(target=func3) t1.start() t2.start() t3.start()
下面是線程示例的完整代碼:
# /python-sleep/threads.py import time import threading def func1(): for i in range(5): print(f"Running t1, print {i}.") time.sleep(2) def func2(): for i in range(5): print(f"Running t2, print {i}.") time.sleep(1) def func3(): for i in range(4): print(f"Running t3, print {i}.") time.sleep(0.5) t1 = threading.Thread(target=func1) t2 = threading.Thread(target=func2) t3 = threading.Thread(target=func3) t1.start() t2.start() t3.start()
觀察輸出。 執行在三個線程之間發生變化。 線程t3
的等待時間最短,因此掛起的時間最少。 線程t1
的睡眠持續時間最長,為兩秒,因此它是最後一個完成執行的線程。
要了解更多信息,請閱讀有關 Python 中多線程基礎知識的教程。
結論
在本教程中,您學習瞭如何使用 Python 的sleep()
函數為代碼添加時間延遲。
您可以從內置時間模塊time.sleep()
訪問sleep()
函數。 要將執行延遲 n 秒,請使用time.sleep(n)
。 此外,您還看到了通過不同的值、倒計時和多線程延遲循環中後續迭代的示例。
您現在可以探索時間模塊的更多高級功能。 想在 Python 中處理日期和時間嗎? 除了時間模塊之外,您還可以利用日期時間和日曆模塊的功能。
接下來,學習用Python計算時差。