异步调用与多线程
異步調(diào)用并不是要減少線程的開銷, 它的主要目的是讓調(diào)用方法的主線程不需要同步等待在這個函數(shù)調(diào)用上, 從而可以讓主線程繼續(xù)執(zhí)行它下面的代碼.與此同時, 系統(tǒng)會通過從ThreadPool中取一個線程來執(zhí)行,幫助我們將我們要寫/讀的數(shù)據(jù)發(fā)送到網(wǎng)卡.由于不需要我們等待, 我們等于同時做了兩件事情. 這個效果跟自己另外啟動一個線程來執(zhí)行等待方式的寫操作是一樣的.但是, 異步線程可以利用操作系統(tǒng)/.Net的線程池, 系統(tǒng)可以根據(jù)吞吐量動態(tài)的管理線程池的大小.
=======================================================================
異步與多線程,從辯證關系上來看,異步和多線程并不時一個同等關系,異步是目的,多線程只是我們實現(xiàn)異步的一個手段.什么是異步:異步是當一個調(diào)用請求發(fā)送給被調(diào)用者,而調(diào)用者不用等待其結(jié)果的返回.實現(xiàn)異步可以采用多線程技術(shù)或則交給另外的進程來處理
=========================================================================
線程池的實現(xiàn)方法與線程是不一樣的.初始化時在線程池里的線程為0.當進程需要一個線程時,創(chuàng)建一個線程,由此線程執(zhí)行用戶的方法.需要注意的是,此線程執(zhí)行完后并不立即銷毀,而是掛起等待,如果有其他方法需要執(zhí)行,回喚醒進行處理.只有當它等到40秒(沒有官方記錄,有可能是其它數(shù)字)還沒有任務執(zhí)行時才喚醒自己,并銷毀自己,釋放資源.當然,如果線程池中的線程不夠處理任務時,會再次創(chuàng)建一個新線程進行執(zhí)行.
異步有的時候用普通的線程,有的時候用系統(tǒng)的異步調(diào)用功能。有一些IO操作也是異步的,但是未必需要一個線程來運行。例如:硬件是有DMA功能的,在調(diào)用DMA傳輸數(shù)據(jù)的時候,CPU是不需要執(zhí)行處理的,只需要發(fā)起傳輸和等待傳輸結(jié)束即可。具體到.net平臺,比如Socket的BeginSend,如果是運行在Windows??? 2000以后的平臺,在底層就會調(diào)用異步的完成端口來發(fā)送。
.Net中的異步執(zhí)行其實使用的是異步委托。異步委托將要執(zhí)行的方法提交到.net的線程池,由線程池中的線程來執(zhí)行異步方法。
異步執(zhí)行也得執(zhí)行,不在當前線程執(zhí)行,當然得去另外一個線程執(zhí)行。異步通常用系統(tǒng)線程池的線程,通常情況下性能好些。(因為可以多次利用,申請時不需要重新申請一個線程,只需要從池里取就行了。)異步是一種效果,多線程是一種具體技術(shù)。可以說,用“多線程”實現(xiàn)“異步”。
異步和多線程是兩個不同的概念,不能這樣比較.異步請求一般用在IO等耗時操作上,他的好處是函數(shù)調(diào)用立即返回,相應的工作線程立即返還給系統(tǒng)以供重用。由于系統(tǒng)的線程資源是非常寶貴的,通常有一定的數(shù)目限制,如.net默認是25。若使用異步方式,用這些固定數(shù)目的線程在固定的時間內(nèi)就可以服務更多的請求,而如果用同步方式,那么每個請求都自始至終占用這一個線程,服務器可以同時服務的請求數(shù)就少了。當異步操作執(zhí)行完成后,系統(tǒng)會從可用線程中選取一個執(zhí)行回調(diào)程序,這時的這個線程可能是剛開始發(fā)出請求的那個線程,也可能是其他的線程,因為系統(tǒng)選取線程是隨機的事情,所以不能說絕對不是剛開始的那個線程。多線程是用來并發(fā)的執(zhí)行多個任務。
不過有個問題,異步有時優(yōu)先級比主線程還高。這個特點和多線程不同。
轉(zhuǎn)載于:https://www.cnblogs.com/yibinboy/archive/2009/12/28/1634590.html
總結(jié)
- 上一篇: EMOS 如何停止反病毒和防垃圾邮件功能
- 下一篇: 需求规格说明书模板