併發 並行 同步 非同步 多執行緒的區別

2022-08-27 05:36:13 字數 3289 閱讀 3843

多執行緒和非同步操作的異同

多執行緒和非同步操作兩者都可以達到避免呼叫執行緒阻塞的目的,從而提高軟體的可響應性。甚至有些時候我們就認為多執行緒和非同步操作是等同的概念。但是,多執行緒和非同步操作還是有一些區別的。而這些區別造成了使用多執行緒和非同步操作的時機的區別。

非同步操作的本質

所有的程式最終都會由計算機硬體來執行,所以為了更好的理解非同步操作的本質,我們有必要了解一下它的硬體基礎。 熟悉電腦硬體的朋友肯定對dma這個詞不陌生,硬碟、光碟機的技術規格中都有明確dma的模式指標,其實網絡卡、音效卡、顯示卡也是有dma功能的。dma就是直 接記憶體訪問的意思,也就是說,擁有dma功能的硬體在和記憶體進行資料交換的時候可以不消耗cpu資源。只要cpu在發起資料傳輸時傳送乙個指令,硬體就開 始自己和記憶體交換資料,在傳輸完成之後硬體會觸發乙個中斷來通知操作完成。這些無須消耗cpu時間的i/o操作正是非同步操作的硬體基礎。所以即使在dos 這樣的單程序(而且無線程概念)系統中也同樣可以發起非同步的dma操作。

執行緒的本質

執行緒不是乙個計算機硬體的功能,而是作業系統提供的一種邏輯功能,執行緒本質上是程序中一段併發執行的**,所以執行緒需要作業系統投入cpu資源來執行和排程。

非同步操作的優缺點

因為非同步操作無須額外的執行緒負擔,並且使用**的方式進行處理,在設計良好的情況下,處理函式可以不必使用共享變數(即使無法完全不用,最起碼可以減少 共享變數的數量),減少了死鎖的可能。當然非同步操作也並非完美無暇。編寫非同步操作的複雜程度較高,程式主要使用**方式進行處理,與普通人的思維方式有些 初入,而且難以除錯。

多執行緒的優缺點

多執行緒的優點很明顯,執行緒中的處理程式依然是順序執行,符合普通人的思維習慣,所以程式設計簡單。但是多執行緒的缺點也同樣明顯,執行緒的使用(濫用)會給系統帶來上下文切換的額外負擔。並且執行緒間的共享變數可能造成死鎖的出現。

適用範圍

在了解了執行緒與非同步操作各自的優缺點之後,我們可以來**一下執行緒和非同步的合理用途。我認為:當需要執行i/o操作時,使用非同步操作比使用執行緒+同步 i/o操作更合適。i/o操作不僅包括了直接的檔案、網路的讀寫,還包括資料庫操作、web service、httprequest以及.net remoting等跨程序的呼叫。

而執行緒的適用範圍則是那種需要長時間cpu運算的場合,例如耗時較長的圖形處理和演算法執行。但是往 往由於使用執行緒程式設計的簡單和符合習慣,所以很多朋友往往會使用執行緒來執行耗時較長的i/o操作。這樣在只有少數幾個併發操作的時候還無傷大雅,如果需要處 理大量的併發操作時就不合適了。

非同步呼叫與多執行緒

非同步呼叫並不是要減少執行緒的開銷, 它的主要目的是讓呼叫方法的主線程不需要同步等待在這個函式呼叫上, 從而可以讓主線程繼續執行它下面的**.與此同時, 系統會通過從threadpool中取乙個執行緒來執行,幫助我們將我們要寫/讀的資料傳送到網絡卡.由於不需要我們等待, 我們等於同時做了兩件事情. 這個效果跟自己另外啟動乙個執行緒來執行等待方式的寫操作是一樣的.但是, 非同步執行緒可以利用作業系統/.net的執行緒池, 系統可以根據吞吐量動態的管理執行緒池的大小.

非同步有的時候用普通的執行緒,有的時候用系統的非同步呼叫功能。有一些io操作也是非同步的,但是未必需要乙個執行緒來執行。例如:硬體是有dma功能的,在呼叫dma傳輸資料的時候,cpu是不需要執行處理的,只需要發起傳輸和等待傳輸結束即可。具體到.net平台,比如socket的beginsend,如果是執行在windows    2000以後的平台,在底層就會呼叫非同步的完成埠來傳送。

.net中的非同步執行其實使用的是非同步委託。非同步委託將要執行的方法提交到.net的執行緒池,由執行緒池中的執行緒來執行非同步方法。

非同步執行也得執行,不在當前執行緒執行,當然得去另外乙個執行緒執行。非同步通常用系統執行緒池的執行緒,通常情況下效能好些。(因為可以多次利用,申請時不需要重新申請乙個執行緒,只需要從池裡取就行了。)非同步是一種效果,多執行緒是一種具體技術。可以說,用「多執行緒」實現「非同步」。

非同步和多執行緒是兩個不同的概念,不能這樣比較.非同步請求一般用在io等耗時操作上,他的好處是函式呼叫立即返回,相應的工作執行緒立即返還給系統以供重用。由於系統的執行緒資源是非常寶貴的,通常有一定的數目限制,如.net預設是25。若使用非同步方式,用這些固定數目的執行緒在固定的時間內就可以服務更多的請求,而如果用同步方式,那麼每個請求都自始至終占用這乙個執行緒,伺服器可以同時服務的請求數就少了。當非同步操作執行完成後,系統會從可用執行緒中選取乙個執行**程式,這時的這個執行緒可能是剛開始發出請求的那個執行緒,也可能是其他的執行緒,因為系統選取執行緒是隨機的事情,所以不能說絕對不是剛開始的那個執行緒。多執行緒是用來併發的執行多個任務。

不過有個問題,非同步有時優先順序比主線程還高。這個特點和多執行緒不同。

非同步呼叫並不是要減少執行緒的開銷, 它的主要目的是讓呼叫方法的主線程不需要同步等待在這個函式呼叫上, 從而可以讓主線程繼續執行它下面的**.與此同時, 系統會通過從threadpool中取乙個執行緒來執行,幫助我們將我們要寫/讀的資料傳送到網絡卡.由於不需要我們等待, 我們等於同時做了兩件事情. 這個效果跟自己另外啟動乙個執行緒來執行等待方式的寫操作是一樣的.但是, 非同步執行緒可以利用作業系統/.net的執行緒池, 系統可以根據吞吐量動態的管理執行緒池的大小.

非同步有的時候用普通的執行緒,有的時候用系統的非同步呼叫功能。有一些io操作也是非同步的,但是未必需要乙個執行緒來執行。例如:硬體是有dma功能的,在呼叫dma傳輸資料的時候,cpu是不需要執行處理的,只需要發起傳輸和等待傳輸結束即可。具體到.net平台,比如socket的beginsend,如果是執行在windows    2000以後的平台,在底層就會呼叫非同步的完成埠來傳送。

.net中的非同步執行其實使用的是非同步委託。非同步委託將要執行的方法提交到.net的執行緒池,由執行緒池中的執行緒來執行非同步方法。

非同步執行也得執行,不在當前執行緒執行,當然得去另外乙個執行緒執行。非同步通常用系統執行緒池的執行緒,通常情況下效能好些。(因為可以多次利用,申請時不需要重新申請乙個執行緒,只需要從池裡取就行了。)非同步是一種效果,多執行緒是一種具體技術。可以說,用「多執行緒」實現「非同步」。

非同步和多執行緒是兩個不同的概念,不能這樣比較.非同步請求一般用在io等耗時操作上,他的好處是函式呼叫立即返回,相應的工作執行緒立即返還給系統以供重用。由於系統的執行緒資源是非常寶貴的,通常有一定的數目限制,如.net預設是25。若使用非同步方式,用這些固定數目的執行緒在固定的時間內就可以服務更多的請求,而如果用同步方式,那麼每個請求都自始至終占用這乙個執行緒,伺服器可以同時服務的請求數就少了。當非同步操作執行完成後,系統會從可用執行緒中選取乙個執行**程式,這時的這個執行緒可能是剛開始發出請求的那個執行緒,也可能是其他的執行緒,因為系統選取執行緒是隨機的事情,所以不能說絕對不是剛開始的那個執行緒。多執行緒是用來併發的執行多個任務。

不過有個問題,非同步有時優先順序比主線程還高。這個特點和多執行緒不同。

併發並行同步非同步多執行緒

自 首先理解概念 你吃飯吃到一半,來了,你一直到吃完了以後才去接,這就說明你不支援併發也不支援並行。你吃飯吃到一半,來了,你停了下來接了 接完後繼續吃飯,這說明你支援併發。不一定是同時的 你吃飯吃到一半,來了,你一邊打 一邊吃飯,這說明你支援並行。併發的關鍵是你有處理多個任務的能力,不一定要同時。並...

併發 並行 同步 非同步

併發 任務數量大於核心數,兩個或多個時間在同一時間間隔發生 並行 任務數量小於或等於核心數,兩個或多個時間在同一時間發生 你吃飯吃到一半,來了,你一直到吃完了以後才去接,這就說明你不支援併發也不支援並行。你吃飯吃到一半,來了,你停了下來接了 接完後繼續吃飯,這說明你支援併發。不一定是同時的 你吃飯吃...

python 同步非同步,併發並行,同步鎖

併發 系統具有處理多個任務 動作 的能力 並行 系統具有同時處理多個任務 動作 的能力 同步 當程序執行到乙個io 等待外部資料 的時候,需要等待,等待即同步 非同步 當程序執行到乙個io 等待外部資料 的時候,不需要等待,待資料接收成功後,再回來處理。gil 全域性解釋鎖 無論你有多少個執行緒,你...