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