1. 程式人生 > >程序與執行緒理解和關係

程序與執行緒理解和關係

程序 執行緒的含義

程序就是一個程式在一個數據集上的一次動態執行過程。 程序一般由程式、資料集、程序控制塊三部分組成。我們編寫的程式用來描述程序要完成哪些功能以及如何完成;資料集則是程式在執行過程中所需要使用的資源;程序控制塊用來記錄程序的外部特徵,描述程序的執行變化過程,系統可以利用它來控制和管理程序,它是系統感知程序存在的唯一標誌。程序執行程式的最小單位,任務排程採用時間片輪轉的搶佔式方式進行程序排程。每個程序都有各自的一塊獨立的記憶體,保證程序彼此間的記憶體地址空間的隔離。

執行緒也叫輕量級程序,它是一個基本的CPU執行單元,也是程式執行過程中的最小單元,由執行緒ID、程式計數器、暫存器集合 和堆疊共同組成。執行緒的引入減小了程式併發執行時的開銷,提高了作業系統的併發效能。 執行緒沒有自己的系統資源,只擁有在執行時必不可少的資源。但執行緒可以與同屬與同一程序的其他執行緒共享程序所擁有的其他資源。

程序與執行緒之間的關係

執行緒是屬於程序的,執行緒執行在程序空間內,同一程序所產生的執行緒共享同一記憶體空間,當程序退出時該程序所產生的執行緒都會被強制退出並清除。執行緒可與屬於同一程序的其它執行緒共享程序所擁有的全部資源,但是其本身基本上不擁有系統資源,只擁有一點在執行中必不可少的資訊(如程式計數器、一組暫存器和棧)。

執行緒和程序的操作是由程式觸發系統介面,最後的執行者是系統;協程的操作則是程式設計師。

協程存在的意義:對於多執行緒應用,CPU通過切片的方式來切換執行緒間的執行,執行緒切換時需要耗時(儲存狀態,下次繼續)。協程,則只使用一個執行緒,在一個執行緒中規定某個程式碼塊執行順序。

協程的適用場景:當程式中存在大量不需要CPU的操作時(IO),適用於協程;

Thread方法說明

t.start() : 啟用執行緒,

t.getName() : 獲取執行緒的名稱

t.setName() : 設定執行緒的名稱

t.name : 獲取或設定執行緒的名稱

t.is_alive() : 判斷執行緒是否為啟用狀態

t.isAlive() :判斷執行緒是否為啟用狀態

t.setDaemon() 設定為後臺執行緒或前臺執行緒(預設:False);通過一個布林值設定執行緒是否為守護執行緒,必須在執行start()方法之後才可以使用。如果是後臺執行緒,主執行緒執行過程中,後臺執行緒也在進行,主執行緒執行完畢後,後臺執行緒不論成功與否,均停止;如果是前臺執行緒,主執行緒執行過程中,前臺執行緒也在進行,主執行緒執行完畢後,等待前臺執行緒也執行完成後,程式停止

t.isDaemon() : 判斷是否為守護執行緒

t.ident :獲取執行緒的識別符號。執行緒識別符號是一個非零整數,只有在呼叫了start()方法之後該屬性才有效,否則它只返回None。

t.join() :逐個執行每個執行緒,執行完畢後繼續往下執行,該方法使得多執行緒變得無意義

t.run() :執行緒被cpu排程後自動執行執行緒物件的run方法