1. 程式人生 > >異步編程與多線程編程的聯系和區別

異步編程與多線程編程的聯系和區別

共同點 阻塞 朋友 rom 多任務 代碼 詳細 隨著 一段

1、異步編程與多線程的區別

共同點:異步和多線程兩者都可以達到避免調用線程阻塞的目的,從而提高軟件的可響應性

不同點:

(1)線程不是一個計算機硬件的功能,而是操作系統提供的一種邏輯功能,線程本質上是進程中一段並發運行的代碼,所以線程需要操作系統投入CPU資源來運行和調度。

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

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

這裏有一個疑問。異步操作沒有創建新的線程,我們一定會想,比如有一個文件操作,大量數據從硬盤上讀取,若使用單線程的同步操作自然要等待會很長時間,但是若使用異步操作的話,我們讓數據讀取異步進行,二線程在數據讀取期間去幹其他的事情,我們會想,這怎麽行呢,異步沒有創建其他的線程,一個線程去幹其他的事情去了,那數據的讀取異步執行是去由誰完成的呢?實際上,本質是這樣的。

熟悉電腦硬件的朋友肯定對DMA這個詞不陌生,硬盤、光驅的技術規格中都有明確DMA的模式指標,其實網卡、聲卡、顯卡也是有DMA功能的。DMA就是直 接內存訪問的意思,也就是說,擁有DMA功能的硬件在和內存進行數據交換的時候可以不消耗CPU資源。只要CPU在發起數據傳輸時發送一個指令,硬件就開 始自己和內存交換數據,在傳輸完成之後硬件會觸發一個中斷來通知操作完成。這些無須消耗CPU時間的I/O操作正是異步操作的硬件基礎。所以即使在DOS 這樣的單進程(而且無線程概念)系統中也同樣可以發起異步的DMA操作。

即CPU在數據的長時間讀取過程中 ,只需要做兩件事,第一發布指令,開始數據交換;第二,交換結束,得到指令,CPU再進行後續操作。而中間讀取數據漫長的等待過程,CPU本身就不需要參與,順序執行就是我不參與但是我要幹等著,效率低下;異步執行就是,我不需要參與那我就去幹其他事情去了,你做完了再通知我就可以了(回調)。

但是你想一下,如果有一些異步操作必須要CPU的參與才能完成呢,即我開始的那個線程是走不開的,這該怎麽辦呢,在.NET中,有線程池去完成,線程池會高效率的開啟一個新的線程去完成異步操作,在python中這是系統自己去安排的,無需人工幹預,這就比自己創建很多的線程更加高效。

總結:

(1)“多線程”,第一、最大的問題在於線程本身的調度和運行需要很多時間,因此不建議自己創建太大量的線程;第二、共享資源的調度比較難,涉及到死鎖,上鎖等相關的概念。

(2)“異步” ,異步最大的問題在於“回調”,這增加了軟件設計上的難度。

在實際設計時,我們可以將兩者結合起來:

(1)當需要執行I/O操作時,使用異步操作比使用線程+同步 I/O操作更合適。I/O操作不僅包括了直接的文件、網絡的讀寫,還包括數據庫操作、Web Service、HttpRequest以及.net Remoting等跨進程的調用。異步特別適用於大多數IO密集型的應用程序。
(2)而線程的適用範圍則是那種需要長時間CPU運算的場合,例如耗時較長的圖形處理和算法執行。但是往 往由於使用線程編程的簡單和符合習慣,所以很多朋友往往會使用線程來執行耗時較長的I/O操作。這樣在只有少數幾個並發操作的時候還無傷大雅,如果需要處 理大量的並發操作時就不合適了。

2、在多線程編程和異步編程上的進步(以.NET和python語言為例進行說明)

多線程最大的問題在於“線程的調度”,而在.NET中引入了線程池的概念,避免人為創建多余線程,讓系統進行分配;而Python語言中的多線程編程效率一直飽受詬病,因此python很少使用多線程,一般使用“協程”,後面會講到。

異步最大的問題在於“回調”,.NET隨著版本的升級,從多任務編程,到後面使用await-async關鍵字的提升,讓人更加方便,不用註意到復雜的回調問題,用同步的思維方式進行異步編程。python從3.4版本開始也開始使用協程和時間循環機制,從yield和yield from 語句中受到啟發,解決了“回調問題”,而在python3.5版本中,也是使用了await-async關鍵字,進一步簡化了編程。在這一方面,python和.NET有很多相似之處。(詳細案例會在後面文章中展示)
---------------------
作者:LoveMIss-Y
來源:CSDN
原文:https://blog.csdn.net/qq_27825451/article/details/78853119
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

異步編程與多線程編程的聯系和區別