中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

iOS使用多線程提高數據并發訪問 之八

發布時間:2020-07-15 19:19:31 來源:網絡 閱讀:786 作者:iKingLai 欄目:移動開發

性能


性能是在應用中使用多線程的主要原因。但是,正如你看到的,如果你使用不當的話,你的應用會有很多問題。你的應用會頻繁的崩潰,如果你不能控制多線程帶來的風險,就像我之前提到的。更進一步的,有些函數不能工作,因為有些線程會阻塞或永遠等待。因此如果你的應用使用了多線程,你必須在擔心性能之前確保你的應用正確運行。


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


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

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

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


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


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


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


iOS使用多線程提高數據并發訪問 之八

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


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

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

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


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


當你設計多線程應用時,還有一些其他的問題你需要注意。看下面的代碼,看下你能否發現其中的問題:


iOS使用多線程提高數據并發訪問 之八

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




向AI問一下細節

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

AI

扶余县| 山东省| 新丰县| 奇台县| 仪陇县| 胶南市| 五原县| 抚顺市| 揭西县| 庆云县| 伊金霍洛旗| 依兰县| 西安市| 宁波市| 满城县| 广宁县| 亳州市| 都匀市| 三江| 西乌珠穆沁旗| 乐山市| 育儿| 精河县| 信宜市| 萨迦县| 金昌市| 高阳县| 博爱县| 五莲县| 成武县| 石狮市| 二连浩特市| 集贤县| 巴青县| 庆元县| 乡宁县| 泸州市| 泰宁县| 嘉义市| 泰州市| 易门县|