《Python 多線程》 可以跟這篇文章進行比較
from multiprocessing import Process
import time
def work(x, n):
print(x)
time.sleep(2)
print(n)
def otherWork(x, n):
print(x)
time.sleep(2)
print(n)
if __name__ == '__main__':
p = Process(target=work, args=("Hello world", 1))
p.start()
p1 = Process(target=otherWork, args=("Hello world", 2))
p1.start()
輸出:
Hello world
Hello world
1
2
在主程序中的p.join()函數,如果加上join的話就是先讓一個程序執行完了之後,然後在執行新的程序,這時候就會阻塞這這裡,如果沒有這個join的話,這幾個程序的輸出的同時的。
程序和線程的差別
一個程序中的各個線程與主程序共享相同的資源,與程序間互相獨立相比,線程之間資訊共享和通信更加容易(都在程序中,并且共享記憶體等)。
線程一般以并發執行,正是由于這種并發和資料共享機制,使多任務間的協作成為可能。
程序一般以并行執行,這種并行能使得程式能同時在多個CPU上運作;
差別于多個線程隻能在程序申請到的的“時間片”内運作(一個CPU内的程序,啟動了多個線程,線程排程共享這個程序的可執行時間片),程序可以真正實作程式的“同時”運作(多個CPU同時運作)。
一般來說,在Python中編寫并發程式的經驗:
計算密集型任務使用多程序 IO密集型(如:網絡通訊)任務使用多線程,較少使用多程序。這是由于 IO操作需要獨占資源,比如:網絡通訊(微觀上每次隻有一個人說話,宏觀上看起來像同時聊天)每次隻能有一個人說話檔案讀寫同時隻能有一個程式操作(如果兩個程式同時給同一個檔案寫入 ‘a’, ‘b’,那麼到底寫入檔案的哪個呢?) 都需要控制資源每次隻能有一個程式在使用,在多線程中,由主程序申請IO資源,多線程逐個執行,哪怕搶占了,也是逐個運作,感覺上“多線程”并發執行了。 如果多程序,除非一個程序結束,否則另外一個完全不能用,顯然多程序就“浪費”資源了。
1、程序和線程的差別?
解析:(1)程序是資源的配置設定和排程的一個獨立單元,而線程是CPU排程的基本單元
(2)同一個程序中可以包括多個線程,并且線程共享整個程序的資源(寄存器、堆棧、上下文),一個進行至少包括一個線程。
(3)程序的建立調用fork或者vfork,而線程的建立調用pthread_create,程序結束後它擁有的所有線程都将銷毀,而線程的結束不會影響同個程序中的其他線程的結束
(4)線程是輕兩級的程序,它的建立和銷毀所需要的時間比程序小很多,所有作業系統中的執行功能都是建立線程去完成的
(5)線程中執行時一般都要進行同步和互斥,因為他們共享同一程序的所有資源
(6)線程有自己的私有屬性TCB,線程id,寄存器、硬體上下文,而程序也有自己的私有屬性程序控制塊PCB,這些私有屬性是不被共享的,用來标示一個程序或一個線程的标志
2、死鎖?死鎖産生的原因?死鎖的必要條件?怎麼處理死鎖?
解析:(--)互相等待資源而産生的一種僵持狀态,如果沒有外力的幹預将一直持續這個狀态
(--)系統資源不足、互相競争資源、請求資源順序不當
(2)互斥、不可搶占、循環等待、請求與保持
(3)因為互斥是不可改變的,是以隻能破壞其他三個條件中的一個來解除死鎖,方法:剝奪資源、殺死其中一個線程
3、Windows記憶體管理方式:段存儲、頁存儲、段頁存儲
解析:
4、程序的幾種狀态?
解析:(1)run(運作狀态):正在運作的程序或在等待隊列中對待的程序,等待的程序隻要以得到cpu就可以運作
(2)Sleep(可中斷休眠狀态):相當于阻塞或在等待的狀态
(3)D(不可中斷休眠狀态):在磁盤上的程序
(4)T(停止狀态):這中狀态無法直覺的看見,因為是程序停止後就釋放了資源,是以不會留在linux中
(5)Z(僵屍狀态):子程序先與父程序結束,但父程序沒有調用wait或waitpid來回收子程序的資源,是以子程序就成了僵屍程序,如果父程序結束後任然沒有回收子程序的資源,那麼1号程序将回收
線程和程序各自有什麼差別和優劣呢?
- 程序是資源配置設定的最小機關,線程是程式執行的最小機關。
- 程序有自己的獨立位址空間,每啟動一個程序,系統就會為它配置設定位址空間,建立資料表來維護代碼段、堆棧段和資料段,這種操作非常昂貴。而線程是共享程序中的資料的,使用相同的位址空間,是以CPU切換一個線程的花費遠比程序要小很多,同時建立一個線程的開銷也比程序要小很多。
- 線程之間的通信更友善,同一程序下的線程共享全局變量、靜态變量等資料,而程序之間的通信需要以通信的方式(IPC)進行。不過如何處理好同步與互斥是編寫多線程程式的難點。
- 但是多程序程式更健壯,多線程程式隻要有一個線程死掉,整個程序也死掉了,而一個程序死掉并不會對另外一個程序造成影響,因為程序有自己獨立的位址空間。