詳解python程序中的多任務(wù)
現(xiàn)實(shí)生活中,有很多場景中的事情是同時進(jìn)行的,比如開車的時候,手和腳共同來駕駛汽車,再比如唱歌跳舞也是同時進(jìn)行的。
以上這些可以理解為多任務(wù)。那在程序中怎么能做到多任務(wù),它有什么好處?
接下來我們來看看沒有多任務(wù)的程序是什么效果。
import time
def sing():
for i in range(5):
print("正在唱...")
time.sleep(1)
def dance():
for i in range(5):
print("正在跳...")
time.sleep(1)
def main():
sing()
dance()
if __name__ == "__main__":
main()
運(yùn)行結(jié)果:

這個程序執(zhí)行需要10秒鐘,但是如果唱歌和跳舞能同時執(zhí)行的話,只需要5秒鐘就可以了。
沒有多任務(wù)的時候,想一起執(zhí)行上面的多個函數(shù)是做不到的,我們要學(xué)習(xí)的多任務(wù)就是多個函數(shù)(唱歌和跳舞)一起執(zhí)行。
接下來我們來實(shí)現(xiàn)簡單的多任務(wù)。
大家暫時不用關(guān)系代碼怎么寫,后續(xù)我們會具體講解。
import time
import threading
def sing():
for i in range(5):
print("正在唱...")
time.sleep(1)
def dance():
for i in range(5):
print("正在跳...")
time.sleep(1)
def main():
t1 = threading.Thread(target=sing)
t2 = threading.Thread(target=dance)
t1.start()
t2.start()
if __name__ == "__main__":
main()
運(yùn)行結(jié)果:

多任務(wù)的概念
什么叫“多任務(wù)”呢?簡單地說,就是操作系統(tǒng)可以同時運(yùn)行多個任務(wù)。
打個比方,你一邊在用瀏覽器上網(wǎng),一邊在聽MP3,一邊在用 Word 趕作業(yè),這就是多任務(wù)。
至少同時有3個任務(wù)正在運(yùn)行,還有很多任務(wù)悄悄地在后臺同時運(yùn)行著,只是桌面上沒有顯示而已。
現(xiàn)在,多核 CPU 已經(jīng)非常普及了,但是,即使過去的單核CPU,也可以執(zhí)行多任務(wù)。
由于 CPU 執(zhí)行代碼都是順序執(zhí)行的,那么,單核CPU是怎么執(zhí)行多任務(wù)的呢?
答案就是操作系統(tǒng)輪流讓各個任務(wù)交替執(zhí)行,任務(wù)1執(zhí)行0.01秒,切換到任務(wù)2,任務(wù)2執(zhí)行0.01秒,再切換到任務(wù)3,執(zhí)行0.01秒……這樣反復(fù)執(zhí)行下去。
表面上看,每個任務(wù)都是交替執(zhí)行的,但是,由于CPU的執(zhí)行速度實(shí)在是太快了,我們感覺就像所有任務(wù)都在同時執(zhí)行一樣。
真正的并行執(zhí)行多任務(wù)只能在多核 CPU 上實(shí)現(xiàn),但是,由于任務(wù)數(shù)量遠(yuǎn)遠(yuǎn)多于 CPU 的核心數(shù)量,所以,操作系統(tǒng)也會自動把很多任務(wù)輪流調(diào)度到每個核心上執(zhí)行。
那這里就引出了2個概念。
并發(fā)
指的是任務(wù)數(shù)多于 cpu 核數(shù),通過操作系統(tǒng)的各種任務(wù)調(diào)度算法,實(shí)現(xiàn)多個任務(wù)“一起”執(zhí)行。
多個進(jìn)程指令被快速輪換執(zhí)行,使得在宏觀上具有多個進(jìn)程同時執(zhí)行的效果。
實(shí)際上總有一些任務(wù)不在執(zhí)行,因?yàn)榍袚Q任務(wù)的速度相當(dāng)快,看上去一起執(zhí)行而已。
并行
指的是任務(wù)數(shù)小于等于 cpu 核數(shù),在同一時刻有多條指令在多個處理器上真的同時執(zhí)行。
多任務(wù)的好處
多任務(wù)可以簡單地理解為同時執(zhí)行多個不同程序,它有如下好處:
- 可以把占據(jù)長時間的程序中的任務(wù)放到后臺去處理。
- 用戶界面可以更加吸引人,比如用戶點(diǎn)擊了一個按鈕去觸發(fā)某些事件的處理,界面上可以彈出一個進(jìn)度條來顯示處理的進(jìn)度。
- 程序的運(yùn)行速度可能加快。
- 在一些等待的任務(wù)實(shí)現(xiàn)上如用戶輸入、文件讀寫和網(wǎng)絡(luò)收發(fā)數(shù)據(jù)等,可以釋放一些珍貴的資源如內(nèi)存占用等等。
以上就是詳解python程序中的多任務(wù)的詳細(xì)內(nèi)容,更多關(guān)于python 多任務(wù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用Python實(shí)現(xiàn)博客上進(jìn)行自動翻頁
這篇文章主要介紹了使用Python實(shí)現(xiàn)博客上進(jìn)行自動翻頁,需要的朋友可以參考下2017-08-08
Pytorch實(shí)戰(zhàn)之?dāng)?shù)據(jù)加載和處理詳解
Pytorch提供了許多工具來簡化和希望數(shù)據(jù)加載,使代碼更具可讀性,本文將通過一些簡單示例為大家具體講講,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-06-06
如何實(shí)現(xiàn)在遠(yuǎn)程linux服務(wù)器上運(yùn)行python代碼
這篇文章主要介紹了如何實(shí)現(xiàn)在遠(yuǎn)程linux服務(wù)器上運(yùn)行python代碼問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
Python數(shù)據(jù)分析Pandas?Dataframe排序操作
這篇文章主要介紹了Python數(shù)據(jù)分析Pandas?Dataframe排序操作,數(shù)據(jù)的排序是比較常用的操作,DataFrame?的排序分為兩種,一種是對索引進(jìn)行排序,另一種是對值進(jìn)行排序,接下來就分別都介紹一下,需要的小伙伴可以參考一下2022-05-05
詳解pandas刪除缺失數(shù)據(jù)(pd.dropna()方法)
這篇文章主要介紹了pandas刪除缺失數(shù)據(jù)(pd.dropna()方法),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
Django 狀態(tài)保持搭配與存儲的實(shí)現(xiàn)
本文主要介紹了Django 狀態(tài)保持搭配與存儲的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
python opencv pytesseract 驗(yàn)證碼識別的實(shí)現(xiàn)
這篇文章主要介紹了python opencv pytesseract 驗(yàn)證碼識別的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
python打包exe開機(jī)自動啟動的實(shí)例(windows)
今天小編就為大家分享一篇python打包exe開機(jī)自動啟動的實(shí)例(windows),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06

