天天看點

異步與多線程的差別

1. 異步與多線程的差別?

其實,異步是目的,而多線程是實作這個目的的方法

異步是說,A發起一個操作後(一般都是比較耗時的操作,如果不耗時的操作就沒有必要異步了),可以繼續自顧自的處理它自己的事兒,不用幹等着這個耗時操作傳回。

多線程和異步操作兩者都可以達到避免調用線程阻塞的目的,進而提高軟體的可響應性。甚至有些時候我們就認為多線程和異步操作是等同的概念。但是,多線程和異步操作還是有一些差別的。而這些差別造成了使用多線程和異步操作的時機的差別

2. 異步操作的本質

所有的程式最終都會由計算機硬體來執行,是以為了更好的了解異步操作的本質,我們有必要了解一下它的硬體基礎。 熟悉電腦硬體的朋友肯定對DMA這個詞不陌生,硬碟、光驅的技術規格中都有明确DMA的模式名額,其實網卡、聲霸卡、顯示卡也是有DMA功能的。DMA就是直接記憶體通路的意思,也就是說,擁有DMA功能的硬體在和記憶體進行資料交換的時候可以不消耗CPU資源。隻要CPU在發起資料傳輸時發送一個指令,硬體就開 始自己和記憶體交換資料,在傳輸完成之後硬體會觸發一個中斷來通知操作完成。

這些無須消耗CPU時間的I/O操作正是異步操作的硬體基礎。是以即使在DOS 這樣的單程序(而且無線程概念)系統中也同樣可以發起異步的DMA操作。 

異步模式借助于線程池,可以提高CPU的使用率,eg:Android 中 AsyncTask 就是借助與線程池

3. 線程的本質

線程不是一個計算機硬體的功能,而是作業系統提供的一種邏輯功能,線程本質上是程序中一段并發運作的代碼,是以線程需要作業系統投入CPU資源來運作和排程

4. 異步操作的優缺點

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

5. 多線程的優缺點

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

6. 适用範圍

  • 計算密集型工作,采用多線程。
  • IO密集型工作,采用異步機制。

繼續閱讀