計算機中的多工
併發與並行
- 併發處理(concurrency processing):指乙個時間段中有幾個程式都處於已啟動執行到執行完畢之間,且這幾個程式都是在同乙個處理機(cpu)上執行,但任乙個時刻點上只有乙個程式在處理機(cpu)上執行
- 並行處理(parallel processing):是計算機系統中能同時執行兩個或更多個處理的一種計算方法。並行處理可同時工作於同一程式的不同方面。並行處理的主要目的是節省大型和複雜問題的解決時間。
併發的關鍵是你有處理多個任務的能力,不一定要同時。並行的關鍵是你有同時處理多個任務的能力。所以說,並行是併發的子集
程序:乙個程式的執行例項。,每個程序提供執行程式所需的所有資源。程序本質上是資源的集合
乙個程序有虛擬的位址空間,可執行的**,作業系統的介面,安全的上下文(記錄啟動該程序的使用者和許可權等),唯一的程序id,環境變數,優先順序類,最小和最大的工作空間(記憶體空間),還要至少有乙個執行緒。
程序的建立----fork()
windows下無法執行
現在,多核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(
)
在unix/linux中,提供了fork()系統函式
fork()子程序永遠返回0,而父程序返回子程序的id
乙個父程序可以fork出很多子程序。父程序可以記下每個子程序的id,而子程序只需要呼叫getppid()
執行緒是作業系統能夠運算排程的最小單位。執行緒被包含在程序之中,是程序中的實際運作單位。一條執行緒是程序中乙個單一順序的控制流,乙個程序中可以併發多個執行緒,每條執行緒併發執行的不同的任務
一條執行緒是乙個execution context (執行上下文),即乙個cpu執行時所需要的一串指令。
假設你正在讀一本書,沒有讀完,你想休息一下,但是你想在回來時恢復到當時讀的具體進度。有乙個方法就是記下頁數、行數與字數這三個數值,這些數值就是execution context。如果你的室友在你休息的時候,使用相同的方法讀這本書。你和她只需要這三個數字記下來就可以在交替的時間共同閱讀這本書了。
執行緒的工作方式與此類似。cpu會給你乙個在同一時間能夠做多個運算的幻覺,實際上它在每個運算上只花了極少的時間,本質上cpu同一時刻只幹了一件事。它能這樣做就是因為它有每個運算的execution context。就像你能夠和你朋友共享同一本書一樣,多工也能共享同一塊cpu。
import threading
import time
def download_music():
for i in range(5):
time.sleep(1)
def play_music():
for i in range(5):
time.sleep(1)
def main():
# 建立兩個執行緒物件
t1=threading.thread(target=download_music)
t2=threading.thread(target=play_music)
t1.start()
t2.start()
if __name__=='__main__':
main()
import threading
import time
class mythread(threading.thread):
def run(self):
for i in range(5):
time.sleep(1)
msg='i am'+ self.name+'@'+str(i)
print(msg)
if __name__=='__main__':
t1=mythread()
t2=mythread()
t1.start()
t2.start()
python 的theading.thead類有乙個run方法,用於定義執行緒的功能函式,可以在自己的執行緒類中覆蓋該方法。而建立自己的執行緒例項後,通過thread的start()方法,可以啟動該執行緒。當該執行緒獲得執行的機會時,就會呼叫run()方法執行執行緒
執行緒何時開啟,何時結束。
子執行緒何時結束
檢視當前的執行緒數量
主線程何時結束
import threading
import time
class mythread(threading.thread):
def run(self):
for i in range(5):
time.sleep(1)
msg='i am'+ self.name+'@'+str(i)
print(msg)
def test2():
for i in range(5):
t=mythread()
t.start()
if __name__=='__main__':
test2()
i amthread-5@0i amthread-4@0
i amthread-3@0i amthread-1@0i amthread-2@0
i amthread-1@1i amthread-4@1i amthread-3@1i amthread-2@1i amthread-5@1
i amthread-5@2i amthread-1@2i amthread-2@2
i amthread-3@2i amthread-4@2
i amthread-3@3i amthread-2@3i amthread-4@3i amthread-1@3
i amthread-5@3
i amthread-2@4i amthread-4@4
i amthread-1@4i amthread-5@4
read-5@2i amthread-1@2i amthread-2@2
i amthread-3@2i amthread-4@2
i amthread-3@3i amthread-2@3i amthread-4@3i amthread-1@3
i amthread-5@3
i amthread-2@4i amthread-4@4
i amthread-1@4i amthread-5@4
i amthread-3@4
8 6多工介紹
1.現實中的多工 看著動畫吃飯 2.計算機中的多工 計算機中的多工是指,作業系統同時完成多項任務的處理。此處同時是指同乙個時間段內,而非某個瞬時的時間點。多工處理是指,使用者在同一時間段內執行多個應用程式,每個應用程式就可以稱之為乙個任務。現在,多核cpu已經非常普及了,但是,即使過去的單核cpu,...
python 多工介紹
多工介紹 在現實生活中,有很多的場景中的事情是同時進行的,比如跳舞和唱歌是同時進行的。在程式中,可以使用 來模擬唱歌和跳舞的功能 from time import sleep def sing for i in range 3 print 正在唱歌.d i sleep 1 def dance for...
Python 多工介紹
僅用學習參考 多工介紹 現實生活中 有很多的場景中的事情是同時進行的,比如開車的時候 手和腳共同來駕駛汽車,再比如唱歌跳舞也是同時進行的 試想,如果把唱歌和跳舞這2件事情分開依次完成的話,估計就沒有那麼好的效果了 想一下場景 先唱歌,然後在跳舞,o o哈哈 程式中如下程式,來模擬 唱歌跳舞 這件事情...