溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

iOS使用多線程提高數(shù)據(jù)并發(fā)訪問 之八

發(fā)布時間:2020-07-15 19:19:31 來源:網(wǎng)絡(luò) 閱讀:778 作者:iKingLai 欄目:移動開發(fā)

性能


性能是在應用中使用多線程的主要原因。但是,正如你看到的,如果你使用不當?shù)脑挘愕膽脮泻芏鄦栴}。你的應用會頻繁的崩潰,如果你不能控制多線程帶來的風險,就像我之前提到的。更進一步的,有些函數(shù)不能工作,因為有些線程會阻塞或永遠等待。因此如果你的應用使用了多線程,你必須在擔心性能之前確保你的應用正確運行。


根據(jù)前面提到的這些問題,如果你的應用需要使用多線程來加速運行的話,你應該深思熟慮。為了決定一個計算是否需要工作在多個單獨的線程上,你需要問問自己你的計算是cpu密集型還是io密集型的任務。


一個cpu密集型的任務是指大部分的時間都是在cpu上工作,保存cpu忙碌。下面的這些例子就是cpu密集型的任務:

  • 復雜的算法,例如當計算一個有些的邏輯時對兩個數(shù)組進行合并。

  • 為一個給定的字符串在內(nèi)存(已經(jīng)加載和存儲在內(nèi)存中)中掃描一個大的字符串。


IO密集型就是大部分的時間都是在等待其他資源的數(shù)據(jù)。例如,你需要從文件或遠程服務器上讀和加載圖片,你的線程大部分時間無事可干,只能等待遠程服務器的數(shù)據(jù)。這些任務稱為IO任務,他們需要在單獨的線程中調(diào)用。


為什么你不應該把一個cpu密集型任務分割到很多線程中去執(zhí)行?它能幫助你計算更快嗎?圖6-12解釋的更詳細。


在圖6-12中你可以看到,當一個cpu需要從一個線程切換到另一個線程的時候,要花費時間和資源。因此,這對于任何應用來說都是一個額外的消耗。如果你的任務只是一個cpu密集型的,完成整個任務可能會花費cpu更多的時間,因為任務的數(shù)量想一樣的,但是cpu需要處理額外的消耗。但是,如果將來iPhone有額外的cpu內(nèi)核的話,把任務分離出去是有意義的。


iOS使用多線程提高數(shù)據(jù)并發(fā)訪問 之八

在IO任務中,情況是不同的。如果cpu沒有切換到其他線程,它只是在那里等待數(shù)據(jù),什么也不做。因此,在IO任務中,你應該總是把它放在另一個線程中,這樣cpu就可以做其他事情,而不只是等待數(shù)據(jù)。


換句話說,想象一下超市。你的任務是服務所有顧客。這里有兩個場景來幫助解釋這兩個概念:

  • 如果所有的顧客都是一樣的,他們頻繁的到來,你可以選擇把他們放在很多相同的收銀線上或者把他們放在同一隊列中。如果你把顧客放在很多的收銀線中,但是你只有一個收銀員,他需要從一個柜臺頻繁的到另一個柜臺來服務所有顧客。但是,如果你讓他們在同一個隊列中,那么這個收銀員就不需要移動。這就是cpu密集型任務。

  • 但是,不同的情況是,如果你有很多不同類型的顧客,他們也不是頻繁的到來。例如,你可以有一個顧客服務臺,一個自助收銀區(qū)域,一個收銀線區(qū)域。現(xiàn)在,如果顧客不是頻繁的來,你的收銀員將不得不在那里站著等待,什么也做不了。或者他可以頻繁的從一個區(qū)域切換到另一個區(qū)域,在顧客服務臺回答問題,在自助收銀臺幫助其他人。你不需要雇傭3個收銀員,你不能把你的顧客放在同一個隊列。這類似于IO密集型任務,你的數(shù)據(jù)不是相同的,也不是在一個隊列中頻繁的來到。


你同意需要考慮用戶的響應性。如果你的cpu密集型計算要花很多時間來完成,整個UI將會阻塞,變得不靈敏。因此,如果是主線程(或UI線程),你需要把重量級計算的任務,要么是cpu密集型,要么是IO密集型,從這個線程中移除出去。


當你設(shè)計多線程應用時,還有一些其他的問題你需要注意??聪旅娴拇a,看下你能否發(fā)現(xiàn)其中的問題:


iOS使用多線程提高數(shù)據(jù)并發(fā)訪問 之八

你可能看到或沒有看到,問題出現(xiàn)在@synchronized(self);這行。你正在進行多線程操作時,你阻塞了,在同一時刻,只有一個線程能夠訪問那段代碼。那么這種情況使用多線程的好處是?因此,你必須小心的使用鎖。在做多線程時,需要確保你的IO密集型任務不要長時間等待或阻塞一個線程。如果你線程使用不當,所有線程在啟動任務之前,他們?nèi)匀恍枰嗷サ却?br />




向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI