多線程與異步回調

異步與多線程的區別

1、異步和多線程有什麼區別?其實,異步是目的,而多 線程是實現這個目的的方法。異步是說,A發起一個操做後(通常都是比較耗時的操做,若是不耗時的操做 就沒有必要異步了),能夠繼續自顧自的處理它本身的事兒,不用幹等着這個耗時操做返回。.Net中的這種異步編程模型,就簡化了多線程編程,咱們甚至都不 用去關心Thread類,就能夠作一個異步操做出來。


2、隨着擁有多個硬線程CPU(超線程、雙核)的普及,多線程和異步操做等併發程序設計方法也受到了更多的關注和討論。本文主要是想探討一下如何使用併發來最大化程序的性能。html

  多線程和異步操做的異同算法

  多線程和異步操做二者均可以達到避免調用線程阻塞的目的,從而提升軟件的可響應性。甚至有些時候咱們就認爲多線程和異步操做是等同的概念。可是,多線程和異步操做仍是有一些區別的。而這些區別形成了使用多線程和異步操做的時機的區別。數據庫

  異步操做的本質編程

  全部的程序最終都會由計算機硬件來執行,因此爲了更好的理解異步操做的本質,咱們有必要了解一下它的硬件基礎。 熟悉電腦硬件的朋友確定對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的線程池, 系統能夠根據吞吐量動態的管理線程池的大小.

=======================================================================
異步與多線程,從辯證關係上來看,異步和多線程並不時一個同等關係,異步是目的,多線程只是咱們實現異步的一個手段.什麼是異步:異步是當一個調用請求發送給被調用者,而調用者不用等待其結果的返回.實現異步能夠採用多線程技術或則交給另外的進程來處理
=========================================================================
線 程池的實現方法與線程是不同的.初始化時在線程池裏的線程爲0.當進程須要一個線程時,建立一個線程,由此線程執行用戶的方法.須要注意的是,此線程 執行完後並不當即銷燬,而是掛起等待,若是有其餘方法須要執行,回喚醒進行處理.只有當它等到40秒(沒有官方記錄,有多是其它數字)尚未任務執行時 才喚醒本身,並銷燬本身,釋放資源.固然,若是線程池中的線程不夠處理任務時,會再次建立一個新線程進行執行.

異步有的時候用普通的線程,有的時候用系統的異步調用功能。有一些IO操做也是異步的,可是未必須要一個線程來運行。例如:硬件是有DMA功能的, 在調用 DMA傳輸數據的時候,CPU是不須要執行處理的,只須要發起傳輸和等待傳輸結束便可。具體到.net平臺,好比Socket的BeginSend,若是 是運行在Windows    2000之後的平臺,在底層就會調用異步的完成端口來發送。

.Net中的異步執行其實使用的是異步委託。異步委託將要執行的方法提交到.net的線程池,由線程池中的線程來執行異步方法。

異步執行也得執行,不在當前線程執行,固然得去另一個線程執行。異步一般用系統線程池的線程,一般狀況下性能好些。(由於能夠屢次利用,申請時不 須要重 新申請一個線程,只須要從池裏取就好了。)異步是一種效果,多線程是一種具體技術。能夠說,用「多線程」實現「異步」。

異步和多線程是兩個不一樣的概念,不能這樣比較.異步請求通常用在IO等耗時操做上,他的好處是函數調用當即返回,相應的工做線程當即返還給系統以供 重用。 因爲系統的線程資源是很是寶貴的,一般有必定的數目限制,如.net默認是25。若使用異步方式,用這些固定數目的線程在固定的時間內就能夠服務更多的請 求,而若是用同步方式,那麼每一個請求都自始至終佔用這一個線程,服務器能夠同時服務的請求數就少了。當異步操做執行完成後,系統會從可用線程中選取一個執 行回調程序,這時的這個線程多是剛開始發出請求的那個線程,也多是其餘的線程,由於系統選取線程是隨機的事情,因此不能說絕對不是剛開始的那個線程。 多線程是用來併發的執行多個任務。

不過有個問題,異步有時優先級比主線程還高。這個特色和多線程不一樣。

 

轉帖:https://www.cnblogs.com/liangstudyhome/p/4415328.html

相關文章
相關標籤/搜索