1.現實中的多工
看著動畫吃飯
2.計算機中的多工
計算機中的多工是指,作業系統同時完成多項任務的處理。此處同時是指同乙個時間段內,而非某個瞬時的時間點。
多工處理是指,使用者在同一時間段內執行多個應用程式,每個應用程式就可以稱之為乙個任務。
現在,多核cpu已經非常普及了,但是,即使過去的單核cpu,也可以執行多工。由於cpu執行**都是順序執行的,那麼,單核cpu是怎麼執行多工的呢?
答案就是作業系統輪流讓各個任務交替執行,任務1執行0.01秒,切換到任務2,任務2執行0.01秒,再切換到任務3,執行0.01秒……這樣反覆執行下去。表面上看,每個任務都是交替執行的,但是,由於cpu的執行速度實在是太快了,我們感覺就像所有任務都在同時執行一樣。
真正的並行執行多工只能在多核cpu上實現,但是,由於任務數量遠遠多於cpu的核心數量,所以,作業系統也會自動把很多任務輪流排程到每個核心上執行。
併發與並行
併發的關鍵是你有處理多個任務的能力,不一定要同時。並行的關鍵是你有同時處理多個任務的能力。所以說,並行是併發的子集
import time
defdownload_music()
:for i in
range(5
):time.sleep(1)
# 休眠1秒
print
(% i)
defplay_music()
:for i in
range(5
):time.sleep(1)
# 休眠1秒
print
(% i)
defmain()
: download_music(
) play_music(
)if __name__ ==
'__main__'
: main(
)
程序:乙個程式的執行例項。每個程序提供執行程式所需的所有資源。
程序本質上是資源的集合。
乙個程序有虛擬的位址空間,可執行的**,作業系統的介面、安全的上下文(記錄啟動該程序的使用者和許可權等)、唯一的程序id,環境變數,優先順序類,最小和最大的工作空間(記憶體空間),還要至少有乙個執行緒。
程序的建立----fork()
python的os模組封裝了常見的系統呼叫函式,其中包括
在unix/linux中,提供了fork()系統函式
普通的函式呼叫,呼叫一次,返回一次;
fork()子程序永遠返回0,而父程序返回子程序的id。
乙個父程序可以fork很多子程序。父程序可以記下每個子程序的id,而子程序只需要呼叫getppid()就可以拿到父程序的id。
import os
pid = os.fork(
)if pid <0:
print
("fork 呼叫失敗。"
)elif pid ==0:
print
("我是子程序:\t%s,我的父程序是:\t%s"
%(os.getpid(
), os.getppid())
)else
:print
("我是父程序:\t%s,我的子程序是:\t%s"
%(os.getpid(
), pid)
)print
("父子程序都可以執行這裡。"
)
執行緒是作業系統能夠運算排程的最小單位。執行緒被包含在程序之中,是程序中的實際運作單位。
一條執行緒是程序中乙個單一順序的控制流,乙個程序可以併發多個執行緒,每條執行緒並行執行的不同的任務
一條執行緒是乙個execution context(執行上下文),即乙個cpu執行時所需要的一串指令。
執行緒的工作方式
假設你正在讀一本書,沒有讀完,你想休息一下,但是你想在回來時恢復到當時讀的具體進度。有乙個方法就是記下頁數、行數與字數這三個數值,這些數值就是execution context。如果你的室友在你休息的時候,使用相同的方法讀這本書。你和她只需要這三個數字記下來就可以在交替的時間共同閱讀這本書了。
執行緒的工作方式與此類似。cpu會給你乙個在同一時間能夠做多個運算的幻覺,實際上它在每個運算上只花了極少的時間,本質上cpu同一時刻只幹了一件事。它能這樣做就是因為它有每個運算的execution context。就像你能夠和你朋友共享同一本書一樣,多工也能共享同一塊cpu。
import threading
import time
defdownload_music()
:for i in
range(5
):time.sleep(1)
print
(% i)
defplay_music()
:for i in
range(5
):time.sleep(1)
print
(% i)
defmain()
:# 建立兩個執行緒物件,target指向新開啟的執行緒要執行的函式
t1 = threading.thread(target=download_music)
t2 = threading.thread(target=play_music)
t1.start(
) t2.start(
)if __name__ ==
'__main__'
: main(
)# download_music()
# play_music()
1.可以看出使用多執行緒併發的操作,花費的時間要短得多。
2.當我們呼叫start()時,才會真正的執行執行緒,執行執行緒中的**
python的threading。thread類有乙個run方法,用於定義執行緒的功能函式,可以在自己的執行緒類中覆蓋該方法。而自己的執行緒例項後,通過thread的start()方法,可以啟動該執行緒。當該執行緒獲得執行的機會時,就會呼叫run()方法執行執行緒。
注:
threading.currentthread(
): 返回當前的執行緒變數。
threading.
enumerate()
: 返回乙個包含正在執行的執行緒的list。正在執行指執行緒啟動後、結束前,不包括啟動前和終止後的執行緒。
threading.activecount(
): 返回正在執行的執行緒數量,與len
(threading.
enumerate()
)有相同的結果。
執行緒何時開啟,何時結束
子執行緒何時結束
檢視當前的執行緒數量
主線程何時結束
demo:
python 多工介紹
多工介紹 在現實生活中,有很多的場景中的事情是同時進行的,比如跳舞和唱歌是同時進行的。在程式中,可以使用 來模擬唱歌和跳舞的功能 from time import sleep def sing for i in range 3 print 正在唱歌.d i sleep 1 def dance for...
Python 多工介紹
僅用學習參考 多工介紹 現實生活中 有很多的場景中的事情是同時進行的,比如開車的時候 手和腳共同來駕駛汽車,再比如唱歌跳舞也是同時進行的 試想,如果把唱歌和跳舞這2件事情分開依次完成的話,估計就沒有那麼好的效果了 想一下場景 先唱歌,然後在跳舞,o o哈哈 程式中如下程式,來模擬 唱歌跳舞 這件事情...
多工的介紹
利用現學知識能夠讓兩個函式或者方法同時執行嗎?不能,因為之前所寫的程式都是單任務的,也就是說乙個函式或者方法執行完成另外乙個函式或者方法才能執行,要想實現這種操作就需要使用多工。多工的最大好處是充分利用cpu資源,提高程式的執行效率。多工是指在同一時間內執行多個任務,例如 現在電腦安裝的作業系統都是...