什么是異步:
異步是當(dāng)一個(gè)調(diào)用請(qǐng)求發(fā)送給被調(diào)用者,而調(diào)用者不用等待其結(jié)果的返回.實(shí)現(xiàn)異步可以采用多線(xiàn)程技術(shù)或則交給另外的進(jìn)程來(lái)處理司光。異步和同步是相對(duì)的,同步就是順序執(zhí)行,執(zhí)行完一個(gè)再執(zhí)行下一個(gè),需要等待栅组、協(xié)調(diào)運(yùn)行。異步就是彼此獨(dú)立,在等待某事件的過(guò)程中繼續(xù)做自己的事枢析,不需要等待這一事件完成后再工作玉掸。線(xiàn)程就是實(shí)現(xiàn)異步的一個(gè)方式。異步是讓調(diào)用方法的主線(xiàn)程不需要同步等待另一線(xiàn)程的完成醒叁,從而可以讓主線(xiàn)程干其它的事情司浪。
1. 異步是目的,而多線(xiàn)程是實(shí)現(xiàn)這個(gè)目的的方法把沼。
????異步是說(shuō)啊易,A發(fā)起一個(gè)操作后(一般都是比較耗時(shí)的操作,如果不耗時(shí)的操作就沒(méi)有必要異步了)饮睬,可以繼續(xù)自顧自的處理它自己的事兒认罩,不用等待這個(gè)耗時(shí)操作返回。
2. 隨著隨著擁有多個(gè)硬線(xiàn)程CPU(超線(xiàn)程续捂、雙核)的普及,多線(xiàn)程和異步操作等并發(fā)程序設(shè)計(jì)方法也受到了更多的關(guān)注和討論宦搬。本文主要是想探討一下如何使用并發(fā)來(lái)最大化程序的性能牙瓢。
多線(xiàn)程和異步操作的異同:
多線(xiàn)程和異步操作兩者都可以達(dá)到避免調(diào)用線(xiàn)程阻塞的目的,從而提高軟件的可響應(yīng)性间校。甚至有些時(shí)候我們就認(rèn)為多線(xiàn)程和異步操作是等同的概念矾克。但是,多線(xiàn)程和異步操作還是有一些區(qū)別的憔足。而這些區(qū)別造成了使用多線(xiàn)程和異步操作的時(shí)機(jī)的區(qū)別胁附。
異步操作的本質(zhì):
所有的程序最終都會(huì)由計(jì)算機(jī)硬件來(lái)執(zhí)行酒繁,所以為了更好的理解異步操作的本質(zhì),我們有必要了解一下它的硬件基礎(chǔ)控妻。 熟悉電腦硬件的朋友肯定對(duì)DMA這個(gè)詞不陌生州袒,硬盤(pán)、光驅(qū)的技術(shù)規(guī)格中都有明確DMA的模式指標(biāo)弓候,其實(shí)網(wǎng)卡郎哭、聲卡、顯卡也是有DMA功能的菇存。DMA就是直 接內(nèi)存訪(fǎng)問(wèn)的意思夸研,也就是說(shuō),擁有DMA功能的硬件在和內(nèi)存進(jìn)行數(shù)據(jù)交換的時(shí)候可以不消耗CPU資源依鸥。只要CPU在發(fā)起數(shù)據(jù)傳輸時(shí)發(fā)送一個(gè)指令亥至,硬件就開(kāi) 始自己和內(nèi)存交換數(shù)據(jù),在傳輸完成之后硬件會(huì)觸發(fā)一個(gè)中斷來(lái)通知操作完成贱迟。這些無(wú)須消耗CPU時(shí)間的I/O操作正是異步操作的硬件基礎(chǔ)姐扮。所以即使在DOS 這樣的單進(jìn)程(而且無(wú)線(xiàn)程概念)系統(tǒng)中也同樣可以發(fā)起異步的DMA操作。
異步操作的優(yōu)缺點(diǎn):
1. 優(yōu)點(diǎn):無(wú)需額外的線(xiàn)程負(fù)擔(dān)关筒,使用回調(diào)的方式進(jìn)行處理
2. 優(yōu)點(diǎn):在設(shè)計(jì)良好的情況下溶握,處理函數(shù)可以不必使用共享變量,減少了死鎖的可能性
3. 缺點(diǎn):編寫(xiě)異步操作的復(fù)雜度較高蒸播,程序主要通過(guò)回調(diào)方式進(jìn)行處理睡榆。
4. 缺點(diǎn):與普通思維方式有出入,難于調(diào)試袍榆。
因?yàn)楫惒讲僮鳠o(wú)須額外的線(xiàn)程負(fù)擔(dān)胀屿,并且使用回調(diào)的方式進(jìn)行處理,在設(shè)計(jì)良好的情況下包雀,處理函數(shù)可以不必使用共享變量(即使無(wú)法完全不用宿崭,最起碼可以減少 共享變量的數(shù)量),減少了死鎖的可能才写。當(dāng)然異步操作也并非完美無(wú)暇葡兑。編寫(xiě)異步操作的復(fù)雜程度較高,程序主要使用回調(diào)方式進(jìn)行處理赞草,與普通人的思維方式有些 初入讹堤,而且難以調(diào)試。
線(xiàn)程的本質(zhì):
線(xiàn)程不是一個(gè)計(jì)算機(jī)硬件的功能厨疙,而是操作系統(tǒng)提供的一種邏輯功能洲守,線(xiàn)程本質(zhì)上是進(jìn)程中一段并發(fā)運(yùn)行的代碼,所以線(xiàn)程需要操作系統(tǒng)投入CPU資源來(lái)運(yùn)行和調(diào)度。
多線(xiàn)程的優(yōu)缺點(diǎn):
1. 優(yōu)點(diǎn):順序執(zhí)行梗醇,符合普通人的思維習(xí)慣
2. 缺點(diǎn):線(xiàn)程的濫用會(huì)給系統(tǒng)帶來(lái)上下文切換的額外負(fù)擔(dān)知允。
3. 缺點(diǎn):線(xiàn)程間共享變量可能造成死鎖的出現(xiàn)。
適用范圍:
????????在了解了線(xiàn)程與異步操作各自的優(yōu)缺點(diǎn)之后叙谨,我們可以來(lái)探討一下線(xiàn)程和異步的合理用途温鸽。我認(rèn)為:當(dāng)需要執(zhí)行I/O操作時(shí),使用異步操作比使用線(xiàn)程+同步 I/O操作更合適唉俗。I/O操作不僅包括了直接的文件嗤朴、網(wǎng)絡(luò)的讀寫(xiě),還包括數(shù)據(jù)庫(kù)操作虫溜、Web Service雹姊、HttpRequest以及.net Remoting等跨進(jìn)程的調(diào)用。
而線(xiàn)程的適用范圍則是那種需要長(zhǎng)時(shí)間CPU運(yùn)算的場(chǎng)合衡楞,例如耗時(shí)較長(zhǎng)的圖形處理和算法執(zhí)行吱雏。但是往 往由于使用線(xiàn)程編程的簡(jiǎn)單和符合習(xí)慣,所以很多朋友往往會(huì)使用線(xiàn)程來(lái)執(zhí)行耗時(shí)較長(zhǎng)的I/O操作瘾境。這樣在只有少數(shù)幾個(gè)并發(fā)操作的時(shí)候還無(wú)傷大雅歧杏,如果需要處 理大量的并發(fā)操作時(shí)就不合適了。
一些需要說(shuō)明的點(diǎn):
異步執(zhí)行也得執(zhí)行迷守,不在當(dāng)前線(xiàn)程執(zhí)行犬绒,當(dāng)然得去另外一個(gè)線(xiàn)程執(zhí)行。異步通常用系統(tǒng)線(xiàn)程池的線(xiàn)程兑凿,通常情況下性能好些凯力。(因?yàn)榭梢远啻卫茫暾?qǐng)時(shí)不需要重新申請(qǐng)一個(gè)線(xiàn)程礼华,只需要從池里取就行了咐鹤。)異步是一種效果,多線(xiàn)程是一種具體技術(shù)圣絮。可以說(shuō)祈惶,用“多線(xiàn)程”實(shí)現(xiàn)“異步”。
異步和多線(xiàn)程是兩個(gè)不同的概念扮匠,不能這樣比較.異步請(qǐng)求一般用在IO等耗時(shí)操作上捧请,他的好處是函數(shù)調(diào)用立即返回,相應(yīng)的工作線(xiàn)程立即返還給系統(tǒng)以供重用棒搜。由于系統(tǒng)的線(xiàn)程資源是非常寶貴的血久,通常有一定的數(shù)目限制,如.net默認(rèn)是25帮非。若使用異步方式,用這些固定數(shù)目的線(xiàn)程在固定的時(shí)間內(nèi)就可以服務(wù)更多的請(qǐng)求,而如果用同步方式末盔,那么每個(gè)請(qǐng)求都自始至終占用這一個(gè)線(xiàn)程筑舅,服務(wù)器可以同時(shí)服務(wù)的請(qǐng)求數(shù)就少了。當(dāng)異步操作執(zhí)行完成后陨舱,系統(tǒng)會(huì)從可用線(xiàn)程中選取一個(gè)執(zhí)行回調(diào)程序翠拣,這時(shí)的這個(gè)線(xiàn)程可能是剛開(kāi)始發(fā)出請(qǐng)求的那個(gè)線(xiàn)程,也可能是其他的線(xiàn)程游盲,因?yàn)橄到y(tǒng)選取線(xiàn)程是隨機(jī)的事情误墓,所以不能說(shuō)絕對(duì)不是剛開(kāi)始的那個(gè)線(xiàn)程。多線(xiàn)程是用來(lái)并發(fā)的執(zhí)行多個(gè)任務(wù)益缎。
異步有時(shí)優(yōu)先級(jí)比主線(xiàn)程還高谜慌。這個(gè)特點(diǎn)和多線(xiàn)程不同。
線(xiàn)程池的實(shí)現(xiàn)方法與線(xiàn)程是不一樣的.初始化時(shí)在線(xiàn)程池里的線(xiàn)程為0.當(dāng)進(jìn)程需要一個(gè)線(xiàn)程時(shí),創(chuàng)建一個(gè)線(xiàn)程,由此線(xiàn)程執(zhí)行用戶(hù)的方法.需要注意的是,此線(xiàn)程執(zhí)行完后并不立即銷(xiāo)毀,而是掛起等待,如果有其他方法需要執(zhí)行,回喚醒進(jìn)行處理.只有當(dāng)它等到40秒(沒(méi)有官方記錄,有可能是其它數(shù)字)還沒(méi)有任務(wù)執(zhí)行時(shí)才喚醒自己,并銷(xiāo)毀自己,釋放資源.當(dāng)然,如果線(xiàn)程池中的線(xiàn)程不夠處理任務(wù)時(shí),會(huì)再次創(chuàng)建一個(gè)新線(xiàn)程進(jìn)行執(zhí)行.