【💊 Python的解憂錦囊】time.sleep與asyncio.sleep的不同

更新於 發佈於 閱讀時間約 3 分鐘

看到標題的朋友可能會覺得奇怪, 我們常常看到的不就是time.sleep嗎? 怎麼又多出了asyncio.sleep呢? 這兩者究竟差異在哪邊呢?

我們都知道sleep就是睡眠的意思, 那麼在程式的運作上就是等待, 等待一段時間之後繼續完成任務, time.sleep的部份很好理解, 就是在該段程式碼的地方等待, 直到時間結束繼續往下做, 而這會是一個阻塞的行為, 假設有多個任務需要切換時會較為不利。

而asyncio.sleep則是用於非同步的設計方式, 關於非同步的知識歡迎參考「【Python - asyncio】非同步 I/O 簡介」, 它可以讓我們在某個點等待一段時間, 讓事件處理循環先處理其他任務後再切回原任務繼續執行, 讓我們感覺起來具有連貫性, 但其實背後是一連串有效率的資源應用功能。

asyncio.sleep與time.sleep兩者之間的差異可見下圖:

raw-image


這就是非同步程式的一個魅力之一, 讓我們不會因為一個等待而導致後面的塞車, 進而發揮了單一執行緒的最佳資源使用效用。

重點

來看看下面這段程式碼, 我們創造了兩個任務,每個任務都會執行一段無窮迴圈, 並印出各自任務的號碼, 那麼假設我們照著流程執行時, 會發現到只印出「1」…


import asyncio

async def job(num: int):
while True:
print(f"{num}")

async def main():
task1 = asyncio.create_task(job(1))
task2 = asyncio.create_task(job(2))

await asyncio.gather(task1, task2)

asyncio.run(main())

我們來看看印出後的結果…

1
1
1
1
1
1
1

但其實我們希望兩個任務是互相切換的, 因此我們可以加上asyncio.sleep來讓兩個任務之間產生出一個間隙,就像這樣:


import asyncio

async def job(num: int):
while True:
await asyncio.sleep(0.001)
print(f"{num}")

async def main():
task1 = asyncio.create_task(job(1))
task2 = asyncio.create_task(job(2))

await asyncio.gather(task1, task2)

asyncio.run(main())

我們可以看到兩者之間就能夠切換著執行了…

1
2
1
2
1
2
1
2
1
2
1
2

結語

同樣都是sleep, 卻有不同的作用, 每項功能被設計出來都是有其意義的, 因此我們只要好好的掌握這些技巧, 就能夠將程式發揮的淋漓盡致。

avatar-img
118會員
266內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
阿Han的沙龍 的其他內容
情況描述 我們在「【🔒 Python 先修班】教你親手打包專屬套件庫的手作課(pip install…)」有提到如何打包Python讓自己的程式變成套件, 讓其他人可以用pip install的方式進行安裝,😲 But… 我們實際上打包後, 發現到引用的檔案都有被打包進去,但目錄卻未被打包
我們在「【🔒 Python API框架篇 - FastAPI】Ep.1 啟航」有分享 FastAPI 這套API框架, 那麼當我們想要在應用程式剛執行時就註冊一些事件或者共享GPU運算模型、變數…等,當整個應用程式關閉時也進行釋放作業, 這樣的一個週期循環就是所謂的生命週期, 而在FastAPI這
Frames per second簡稱FPS, 也就是每秒幾個幀數的意思, 平常我們看到的影片背後其實都是一張張圖片的組成, 而這一幅畫面就是影片的每一幀。 由於人眼的特殊生理結構, 畫面的幀數只要高於每秒10 - 12張的時候就會認為是連貫的, 這也就是為什麼電影膠片是一格格的拍攝出來, 但是藉
當我們在開發一個AI應用服務時, 常常會需要載入大模型, But… 我們總不可能每一次的請求就載入一次模型吧! 這樣太沒有效率了, 也非常的浪費資源, 因此我們通常會希望應用程式啟動時就能夠載入模型, 之後每一次的請求只要讓模型進行運算即可, 那麼在FastAPI的框架中究竟要如何使用呢? 首
關於FastAPI這個框架為什麼有什麼樣的優勢, 為什麼會這麼熱門? 歡迎參考「【Python 技術選型】如何選出適合的API框架呢?」。 站在巨人的肩膀上 FastAPI主要基於以下兩個重要的元件組成, Starlette與Pydantic, 就讓我們來看看兩者的關係吧! 安裝 pip
使用Python開發後端API的經驗中應該會常常看到WSGI與ASGI這兩個名詞, 兩者的差異究竟是什麼呢? 就讓我們來為您科普一番。 什麼是WSGI 全名為「Web Server Gateway Interface」 Web伺服器閘道介面,主要規範HTTP請求如何與伺服器溝通, 通
情況描述 我們在「【🔒 Python 先修班】教你親手打包專屬套件庫的手作課(pip install…)」有提到如何打包Python讓自己的程式變成套件, 讓其他人可以用pip install的方式進行安裝,😲 But… 我們實際上打包後, 發現到引用的檔案都有被打包進去,但目錄卻未被打包
我們在「【🔒 Python API框架篇 - FastAPI】Ep.1 啟航」有分享 FastAPI 這套API框架, 那麼當我們想要在應用程式剛執行時就註冊一些事件或者共享GPU運算模型、變數…等,當整個應用程式關閉時也進行釋放作業, 這樣的一個週期循環就是所謂的生命週期, 而在FastAPI這
Frames per second簡稱FPS, 也就是每秒幾個幀數的意思, 平常我們看到的影片背後其實都是一張張圖片的組成, 而這一幅畫面就是影片的每一幀。 由於人眼的特殊生理結構, 畫面的幀數只要高於每秒10 - 12張的時候就會認為是連貫的, 這也就是為什麼電影膠片是一格格的拍攝出來, 但是藉
當我們在開發一個AI應用服務時, 常常會需要載入大模型, But… 我們總不可能每一次的請求就載入一次模型吧! 這樣太沒有效率了, 也非常的浪費資源, 因此我們通常會希望應用程式啟動時就能夠載入模型, 之後每一次的請求只要讓模型進行運算即可, 那麼在FastAPI的框架中究竟要如何使用呢? 首
關於FastAPI這個框架為什麼有什麼樣的優勢, 為什麼會這麼熱門? 歡迎參考「【Python 技術選型】如何選出適合的API框架呢?」。 站在巨人的肩膀上 FastAPI主要基於以下兩個重要的元件組成, Starlette與Pydantic, 就讓我們來看看兩者的關係吧! 安裝 pip
使用Python開發後端API的經驗中應該會常常看到WSGI與ASGI這兩個名詞, 兩者的差異究竟是什麼呢? 就讓我們來為您科普一番。 什麼是WSGI 全名為「Web Server Gateway Interface」 Web伺服器閘道介面,主要規範HTTP請求如何與伺服器溝通, 通
你可能也想看
Google News 追蹤
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
晚睡,是沒有勇氣結束今天;那些習以為常的慣性,我們選擇忽略。如果這些思維像是植物一樣,由內心為出發而成長著,那我們如何改變這些深根蒂固的思維?
Thumbnail
我們呼呼大睡的時候,身體其實忙著幫你修復升級 ? 睡眠不但真的有深淺眠之分,而且還會不斷交替 ? 淺眠、 深眠和做夢其實對身體都超級有用 ? 少睡一些,體內的工作做不完,真的會累積出問題 ? 今天就讓我們來聊聊,睡覺的時候身體都在做些什麼吧 !
認識 async/await基本概念: async 的本質是 promise 的語法糖 ,只要 function 標記為 async,就表示裡頭可以撰寫 await 的同步語法,而 await 顧名思義就是「等待」,它會確保一個 promise 物件都解決 ( resolve ) 或出錯 ( re
※ 同步概念: 單純地「由上而下」執行程式碼,而且一次只執行一件事,也就是「按順序執行,一個動作結束才能切換到下一個」。缺點是你需要「等待」事情執行完畢,才能繼續往下走。 ※ 非同步概念: 盡可能讓主要的執行程序不需要停下來等待,若遇到要等待的事情,就發起一個「非同步處理」,讓主程序繼續執行,
Thumbnail
你是不想睡,還是害怕起床? 在床上翻來覆去睡不著的時候,我的腦中突然冒出這個問題,有時我們拖延睡眠是由於工作和生活的夾擊,讓我們感覺缺乏能夠自主控制的時間。然而,長期的拖延睡眠會導致身體慢性發炎疲勞、心理憂鬱不快樂。本文將分享從《更快樂的1小時》一書中學習的方法,希望能對為睡眠所苦的你有所幫助。
拖延和休息是兩回事兒。 有時候我們會把拖延當成休息的藉口,但實際上這並不是一樣的。當我們感到壓力、焦慮或不確定時,就會更容易陷入拖延的陷阱。 對於那些不想做但又必須去做的事情,這種情況尤其明顯。 拖延的原因有很多,可能是因為任務太難、太乏味,或者我們對它沒有興趣。我們也可能會感到害怕失敗,擔心
Thumbnail
當你需要在 Python 中執行多個任務,但又不希望它們相互阻塞時,可以使用 threading 模組。 threading 模組允許你在單個程序中創建多個執行緒,這些執行緒可以同時運行,從而實現並行執行多個任務的效果。
Thumbnail
你知道嗎?睡眠不只是讓我們休息,還能提升免疫力、維護心理健康,讓我們在白天精神飽滿!😊
Thumbnail
非同步程式設計(Asynchronous programming) 或是簡單的稱之為 async,它是一種並發程式模型(concurrent programming model),其目的就是讓多個任務能同時在作業系統的執行緒上執行,並透過 async/.await 保留同步。
Thumbnail
休息是指暫時中斷工作、活動或努力,以使身體和心靈得到恢復和放鬆的過程。休息的形式有所差異,必須充分了解自己,並找到適合自己的休息方式。這篇文章探討了關於休息的一些迷思,如何休息以及休息的重要性。
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
晚睡,是沒有勇氣結束今天;那些習以為常的慣性,我們選擇忽略。如果這些思維像是植物一樣,由內心為出發而成長著,那我們如何改變這些深根蒂固的思維?
Thumbnail
我們呼呼大睡的時候,身體其實忙著幫你修復升級 ? 睡眠不但真的有深淺眠之分,而且還會不斷交替 ? 淺眠、 深眠和做夢其實對身體都超級有用 ? 少睡一些,體內的工作做不完,真的會累積出問題 ? 今天就讓我們來聊聊,睡覺的時候身體都在做些什麼吧 !
認識 async/await基本概念: async 的本質是 promise 的語法糖 ,只要 function 標記為 async,就表示裡頭可以撰寫 await 的同步語法,而 await 顧名思義就是「等待」,它會確保一個 promise 物件都解決 ( resolve ) 或出錯 ( re
※ 同步概念: 單純地「由上而下」執行程式碼,而且一次只執行一件事,也就是「按順序執行,一個動作結束才能切換到下一個」。缺點是你需要「等待」事情執行完畢,才能繼續往下走。 ※ 非同步概念: 盡可能讓主要的執行程序不需要停下來等待,若遇到要等待的事情,就發起一個「非同步處理」,讓主程序繼續執行,
Thumbnail
你是不想睡,還是害怕起床? 在床上翻來覆去睡不著的時候,我的腦中突然冒出這個問題,有時我們拖延睡眠是由於工作和生活的夾擊,讓我們感覺缺乏能夠自主控制的時間。然而,長期的拖延睡眠會導致身體慢性發炎疲勞、心理憂鬱不快樂。本文將分享從《更快樂的1小時》一書中學習的方法,希望能對為睡眠所苦的你有所幫助。
拖延和休息是兩回事兒。 有時候我們會把拖延當成休息的藉口,但實際上這並不是一樣的。當我們感到壓力、焦慮或不確定時,就會更容易陷入拖延的陷阱。 對於那些不想做但又必須去做的事情,這種情況尤其明顯。 拖延的原因有很多,可能是因為任務太難、太乏味,或者我們對它沒有興趣。我們也可能會感到害怕失敗,擔心
Thumbnail
當你需要在 Python 中執行多個任務,但又不希望它們相互阻塞時,可以使用 threading 模組。 threading 模組允許你在單個程序中創建多個執行緒,這些執行緒可以同時運行,從而實現並行執行多個任務的效果。
Thumbnail
你知道嗎?睡眠不只是讓我們休息,還能提升免疫力、維護心理健康,讓我們在白天精神飽滿!😊
Thumbnail
非同步程式設計(Asynchronous programming) 或是簡單的稱之為 async,它是一種並發程式模型(concurrent programming model),其目的就是讓多個任務能同時在作業系統的執行緒上執行,並透過 async/.await 保留同步。
Thumbnail
休息是指暫時中斷工作、活動或努力,以使身體和心靈得到恢復和放鬆的過程。休息的形式有所差異,必須充分了解自己,並找到適合自己的休息方式。這篇文章探討了關於休息的一些迷思,如何休息以及休息的重要性。