1. 程式人生 > >非同步和多執行緒有什麼區別

非同步和多執行緒有什麼區別

非同步呼叫並不是要減少執行緒的開銷, 它的主要目的是讓呼叫方法的主執行緒不需要同步等待在這個函式呼叫上, 從而可以讓主執行緒繼續執行它下面的程式碼.與此同時, 系統會通過從ThreadPool中取一個執行緒來執行,幫助我們將我們要寫/讀的資料傳送到網絡卡.由於不需要我們等待, 我們等於同時做了兩件事情. 這個效果跟自己另外啟動一個執行緒來執行等待方式的寫操作是一樣的.但是, 非同步執行緒可以利用作業系統/.Net的執行緒池, 系統可以根據吞吐量動態的管理執行緒池的大小.

=======================================================================
非同步與多執行緒,從辯證關係上來看,非同步和多執行緒並不時一個同等關係,非同步是目的,多執行緒只是我們實現非同步的一個手段.什麼是非同步:非同步是當一個呼叫請求傳送給被呼叫者,而呼叫者不用等待其結果的返回.實現非同步可以採用多執行緒技術或則交給另外的程序來處理
=========================================================================
執行緒池的實現方法與執行緒是不一樣的.初始化時線上程池裡的執行緒為0.當程序需要一個執行緒時,建立一個執行緒,由此執行緒執行使用者的方法.需要注意的是,此執行緒執行完後並不立即銷燬,而是掛起等待,如果有其他方法需要執行,回喚醒進行處理.只有當它等到40秒(沒有官方記錄,有可能是其它數字)還沒有任務執行時才喚醒自己,並銷燬自己,釋放資源.當然,如果執行緒池中的執行緒不夠處理任務時,會再次建立一個新執行緒進行執行.

非同步有的時候用普通的執行緒,有的時候用系統的非同步呼叫功能。有一些IO操作也是非同步的,但是未必需要一個執行緒來執行。例如:硬體是有DMA功能的,在呼叫DMA傳輸資料的時候,CPU是不需要執行處理的,只需要發起傳輸和等待傳輸結束即可。具體到.net平臺,比如Socket的BeginSend,如果是執行在Windows    2000以後的平臺,在底層就會呼叫非同步的完成埠來發送。

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

非同步執行也得執行,不在當前執行緒執行,當然得去另外一個執行緒執行。非同步通常用系統執行緒池的執行緒,通常情況下效能好些。(因為可以多次利用,申請時不需要重新申請一個執行緒,只需要從池裡取就行了。)非同步是一種效果,多執行緒是一種具體技術。可以說,用“多執行緒”實現“非同步”。

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

不過有個問題,非同步有時優先順序比主執行緒還高。這個特點和多執行緒不同。