1. 程式人生 > >【Python】程序和多執行緒分別適用於什麼情況?

【Python】程序和多執行緒分別適用於什麼情況?

1.什麼是程序?什麼是執行緒?

程序是表示資源分配的基本單位,又是排程執行的基本單位。例如,使用者執行自己的程式,系統就建立一個程序,併為它分配資源,包括各種表格、記憶體空間、磁碟空間、I/O裝置等。然後,把該程序放人程序的就緒佇列。程序排程程式選中它,為它分配CPU以及其它有關資源,該程序才真正執行。所以,程序是系統中的併發執行的單位。 在Mac、Windows NT等採用微核心結構的作業系統中,程序的功能發生了變化:它只是資源分配的單位,而不再是排程執行的單位。在微核心系統中,真正排程執行的基本單位是執行緒。因此,實現併發功能的單位是執行緒。 執行緒概念   執行緒是程序中執行運算的最小單位,亦即執行處理機排程的基本單位。如果把程序理解為在邏輯上作業系統所完成的任務,那麼執行緒表示完成該任務的許多可能的子任務之一。例如,假設使用者啟動了一個視窗中的資料庫應用程式,作業系統就將對資料庫的呼叫表示為一個程序。假設使用者要從資料庫中產生一份工資單報表,並傳到一個檔案中,這是一個子任務;在產生工資單報表的過程中,使用者又可以輸人資料庫查詢請求,這又是一個子任務。這樣,作業系統則把每一個請求――工資單報表和新輸人的資料查詢表示為資料庫程序中的獨立的執行緒。執行緒可以在處理器上獨立排程執行,這樣,在多處理器環境下就允許幾個執行緒各自在單獨處理器上進行。作業系統提供執行緒就是為了方便而有效地實現這種併發性。

 舉個例子來說多執行緒就像是火車上的每節車廂,而程序就是火車。

2.多程序和多執行緒的區別?

我們從各個方面來看待這個問題,由下面的圖片說明:

對比維度

多程序

多執行緒

總結

資料共享、同步

資料共享複雜,需要用IPC;資料是分開的,同步簡單

因為共享程序資料,資料共享簡單,但也是因為這個原因導致同步複雜

各有優勢

記憶體、CPU

佔用記憶體多,切換複雜,CPU利用率低

佔用記憶體少,切換簡單,CPU利用率高

執行緒佔優

建立銷燬、切換

建立銷燬、切換複雜,速度慢

建立銷燬、切換簡單,速度很快

執行緒佔優

程式設計、除錯

程式設計簡單,除錯簡單

程式設計複雜,除錯複雜

程序佔優

可靠性

程序間不會互相影響

一個執行緒掛掉將導致整個程序掛掉

程序佔優

分散式

適應於多核、多機分散式;如果一臺機器不夠,擴充套件到多臺機器比較簡單

適應於多核分散式

程序佔優

3.程序之間的通訊方式以及優缺點?

1)管道 管道分為有名管道和無名管道 無名管道是一種半雙工的通訊方式,資料只能單向流動,而且只能在具有親緣關係的程序間使用.程序的親緣關係一般指的是父子關係。無明管道一般用於兩個不同程序之間的通訊。當一個程序建立了一個管道,並呼叫fork建立自己的一個子程序後,父程序關閉讀管道端,子程序關閉寫管道端,這樣提供了兩個程序之間資料流動的一種方式。 有名管道也是一種半雙工的通訊方式,但是它允許無親緣關係程序間的通訊。 無名管道:優點:簡單方便;缺點:1)侷限於單向通訊2)只能建立在它的程序以及其有親緣關係的程序之間;3)緩衝區有限; 有名管道:優點:可以實現任意關係的程序間的通訊;缺點:1)長期存於系統中,使用不當容易出錯;2)緩衝區有限 2)訊號量 訊號量是一個計數器,可以用來控制多個執行緒對共享資源的訪問.,它不是用於交換大批資料,而用於多執行緒之間的同步.它常作為一種鎖機制,防止某程序在訪問資源時其它程序也訪問該資源.因此,主要作為程序間以及同一個程序內不同執行緒之間的同步手段. 優點:可以同步程序;缺點:訊號量有限 3)訊號 訊號是一種比較複雜的通訊方式,用於通知接收程序某個事件已經發生. 4)訊息佇列 訊息佇列是訊息的連結串列,存放在核心中並由訊息佇列識別符號標識.訊息佇列克服了訊號傳遞資訊少,管道只能承載無格式位元組流以及緩衝區大小受限等特點.訊息佇列是UNIX下不同程序之間可實現共享資源的一種機制,UNIX允許不同程序將格式化的資料流以訊息佇列形式傳送給任意程序.對訊息佇列具有操作許可權的程序都可以使用msget完成對訊息佇列的操作控制.通過使用訊息型別,程序可以按任何順序讀資訊,或為訊息安排優先順序順序. 優點:可以實現任意程序間的通訊,並通過系統呼叫函式來實現訊息傳送和接收之間的同步,無需考慮同步問題,方便;缺點:資訊的複製需要額外消耗CPU的時間,不適宜於資訊量大或操作頻繁的場合 5)共享記憶體 共享記憶體就是對映一段能被其他程序所訪問的記憶體,這段共享記憶體由一個程序建立,但多個程序都可以訪問.共享記憶體是最快的IPC(程序間通訊)方式,它是針對其它程序間通訊方式執行效率低而專門設計的.它往往與其他通訊機制,如訊號量,配合使用,來實現程序間的同步與通訊. 優點:無須複製,快捷,資訊量大;缺點:1)通訊是通過將共無法實現享空間緩衝區直接附加到程序的虛擬地址空間中來實現的,因此程序間的讀寫操作的同步問題;2)利用記憶體緩衝區直接交換資訊,記憶體的實體存在於計算機中,只能同一個計算機系統中的諸多程序共享,不方便網路通訊 6)套接字:可用於不同及其間的程序通訊 優點:1)傳輸資料為位元組級,傳輸資料可自定義,資料量小效率高;2)傳輸資料時間短,效能高;3) 適合於客戶端和伺服器端之間資訊實時互動;4) 可以加密,資料安全性強 缺點:1) 需對傳輸的資料進行解析,轉化成應用級的資料。

4.執行緒之間的通訊方式?

 # 鎖機制:包括互斥鎖、條件變數、讀寫鎖    *互斥鎖提供了以排他方式防止資料結構被併發修改的方法。    *讀寫鎖允許多個執行緒同時讀共享資料,而對寫操作是互斥的。    *條件變數可以以原子的方式阻塞程序,直到某個特定條件為真為止。對條件的測試是在互斥鎖的保護下進行的。條件變數始終與互斥鎖一起使用。 # 訊號量機制(Semaphore):包括無名執行緒訊號量和命名執行緒訊號量 # 訊號機制(Signal):類似程序間的訊號處理     執行緒間的通訊目的主要是用於執行緒同步,所以執行緒沒有像程序通訊中的用於資料交換的通訊機制。

5.什麼時候用多執行緒?什麼時候用多程序?

1)需要頻繁建立銷燬的優先用執行緒 原因請看上面的對比。 這種原則最常見的應用就是Web伺服器了,來一個連線建立一個執行緒,斷了就銷燬執行緒,要是用程序,建立和銷燬的代價是很難承受的 2)需要進行大量計算的優先使用執行緒 所謂大量計算,當然就是要耗費很多CPU,切換頻繁了,這種情況下執行緒是最合適的。 這種原則最常見的是影象處理、演算法處理。 3)強相關的處理用執行緒,弱相關的處理用程序 什麼叫強相關、弱相關?理論上很難定義,給個簡單的例子就明白了。 一般的Server需要完成如下任務:訊息收發、訊息處理。“訊息收發”和“訊息處理”就是弱相關的任務,而“訊息處理”裡面可能又分為“訊息解碼”、“業務處理”,這兩個任務相對來說相關性就要強多了。因此“訊息收發”和“訊息處理”可以分程序設計,“訊息解碼”、“業務處理”可以分執行緒設計。 當然這種劃分方式不是一成不變的,也可以根據實際情況進行調整。 4)可能要擴充套件到多機分佈的用程序,多核分佈的用執行緒 原因請看上面對比。 5)都滿足需求的情況下,用你最熟悉、最拿手的方式 至於“資料共享、同步”、“程式設計、除錯”、“可靠性”這幾個維度的所謂的“複雜、簡單”應該怎麼取捨,我只能說:沒有明確的選擇方法。但我可以告訴你一個選擇原則:如果多程序和多執行緒都能夠滿足要求,那麼選擇你最熟悉、最拿手的那個。