色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

為什么需要并發編程?GCD如何執行并發/并行?

Android編程精選 ? 來源:稀土掘金 ? 2023-07-21 10:26 ? 次閱讀

為什么需要并發

假設您在主線程上并且需要來自服務器的數據。您從服務器請求數據并等待,直到您從服務器獲得響應。在此期間,您的主線程不會執行任何與 UI 相關的工作,這會使您的應用程序無響應。

假設服務器在此期間需要 10 秒才能給出響應,如果用戶點擊按鈕,系統將不會響應它,這對用戶來說非常糟糕。

如果你可以在同一時間(或大約在同一時間)運行的這兩個任務,一個線程專門處理用戶界面相關的工作,其他的線程處理耗時任務。這樣一來,上面的情況就不會發生了。

并發

并發意味值應用程序可以使用分割時間的方式同時處理多個任務。如果一臺計算機只有一個CPU,那么它無法在一個精確的時間點上同時運行多個任務,但是可以通過上下文切換的方式在一段時間(很短,比如1s)內執行多個任務。

上下文切換是指存儲線程的狀態,并在將來恢復這個狀態繼續執行。這允許多個進程共享一個CPU資源,同時這也是多任務操作系統的基本功能。

并行

并行指多個任務同時發生,并沒有上下文切換。

對于我們討論的情況,如果并行地執行網絡調用,那么將有兩個線程在兩個不同的內核上執行主線程和后臺指令,與前一個相比,速度非??欤枰~外的物理要求-需要CPU有多核。

如下圖所示,在并行的情況下,兩條線程真的在同時執行;而并發,在一個線程執行時,另一個在休眠。

e2981d1e-26f1-11ee-962d-dac502259ad0.jpg

關于線程的小知識

在單核CPU上,如果你創建了10條線程,那么它只能使用并發/時間片分割/上下文切換的方式執行它們

在10核CPU上,如果你創建了10條線程,那么它們可能以下面的方式執行:

使用上下文切換的方式在1個核心上并發執行

每個線程在獨立的核心上并行執行

一部分并發執行,另外一部分并行執行

在單核CPU上,如果你創建了1000條線程,那么CPU只會忙著上下文切換,而不會執行實質性的任務??梢姡瑒摻ê侠淼木€程數量也是一個不小的挑戰。

GCD 如何執行并發/并行

GCD 在幕后管理共享線程池并在該池中添加最佳線程數。使用 GCD,您將代碼塊或工作項添加到隊列中,GCD 決定在哪個線程上執行它們。GCD 根據系統物理條件或當前負載并發或并行執行此任務。

注意:如果你給 GCD 分配兩個任務,你不確定它是并發還是并行運行。

從現在開始,我們將使用術語并發代表并發/并行。

使用GCD,開發者有什么責任

您所要做的就是定義要并發執行的任務并將它們添加到適當的調度隊列中。GCD 負責創建所需的線程并安排您的任務在這些線程上運行,這非???/p>

調度隊列

調度隊列是一種基于 C 的組件,用于執行自定義任務。調度隊列總是按照任務添加到隊列的順序出列和啟動任務。調度隊列是線程安全的,這意味著您可以同時從多個線程訪問它們。注意,隊列不是線程!

如果您想通過 GCD 執行并發任務,請將它們添加到適當的調度隊列中。GCD 將基于隊列的配置,挑選并執行任務。

串行隊列

串行調度隊列按照添加到隊列的順序一次執行一項任務。假設您將五個任務添加到串行隊列, GCD 將從第一個任務開始,在它執行完成之前,第二個任務將不會開始。

串行隊列通常用于同步對特定資源的訪問。假設您有兩個網絡調用都需要 10 秒,因此您決定將這兩個任務移到某些后臺線程上,而且它們都在訪問相同的資源,您想要進行一些同步,您可以將這些任務放在串行隊列中。

串行隊列串行執行任務意味著一次只有一個線程在使用,但不能保證它們在同一線程上執行。

您可以根據需要創建任意數量的串行隊列,并且每個隊列相對于所有其他隊列同時運行。換句話說,如果您創建四個串行隊列,則每個隊列一次僅執行一項任務,但最多仍可以同時執行四個任務,每個隊列一個。

如果您有兩個任務訪問相同的共享資源,但他們在不同的線程上運行,則任一線程都可以先修改資源,您需要使用鎖來確保兩個任務不會同時修改該資源。您可以將兩個任務添加到串行調度隊列,以確保在任何給定時間只有一個任務修改共享資源。這種基于隊列的同步比鎖更有效,因為在有競爭和無競爭的情況下,鎖總是需要一個昂貴的內核陷阱,而調度隊列主要在應用程序的進程空間中工作,并且只在絕對必要時調用內核。

并發隊列

并發隊列并發執行一個或多個任務

如果您將四個單獨的任務添加到并發隊列,這些任務將按照它們添加到隊列的順序啟動。GCD 選擇第一個任務在一段時間內執行它,然后在不等待第一個任務完成的情況下啟動第二個任務,依此類推。這是理想的地方,這不僅可以真正地做到后臺執行,而且不關心這些任務是否也與其他任務同時運行

當前正在執行的任務在由調度隊列管理的不同線程上運行。

在任何時間點,執行的任務數量是可變的,這取決于系統條件。當您創建具有四個任務的并發隊列時,它會創建多少個線程?答案是不確定。GCD 將使用多少個線程來執行這些任務,這取決于系統條件,它有可能可以使用一條或四條線程。

在 GCD 中,有兩種方法可以同時運行任務,創建自定義并發隊列或使用全局并發隊列。

自定義和全局并發隊列的區別

如下圖所示,我們創建了兩個全局并發隊列,您可以看到由于全局隊列是整個系統共享的并發隊列,因此它始終返回相同的隊列;而自定義并發隊列是私有的,每次創建時都會返回新隊列。

e2bde26a-26f1-11ee-962d-dac502259ad0.jpg

有四個不同優先級的全局并發隊列,但在設置全局并發隊列時,不直接指定優先級。

相反,您指定服務質量 (QoS),其中包括用戶交互、用戶啟動、實用程序和后臺,其中用戶交互具有最高優先級,而后臺具有最低優先級。下面是QoS的使用建議。

.userInteractive 標志任務需要被立即執行以便提供更出色的用戶體驗。通常用來做UI更新,事件處理等低延時的任務。該類型的任務不應過多。

.userInitiated 標志任務被用戶通過UI界面創建,但是可以被異步執行。通常用在用戶一個操作后需要等待,結果返回后繼續之前的操作。

.default 默認值。用于一般性異步任務。

.utility 標志任務需要較長時間,通常會關聯一個進度。比如:I/O、網絡請求等。

.background 標志任務的執行用戶不太會關心。比如:預加載數據。

與全局隊列相比,您可以使用自定義隊列執行以下任務:

您可以指定一個對您有意義的標簽,以便在自定義隊列上進行調試

你可以暫停和重啟: queue.suspend() queue.resume()

提交柵欄任務: queue.async(flags: .barrier) { ... }

主隊列

主隊列是一個全局可用的串行隊列,它在應用程序的主線程上執行任務

該隊列與應用程序的運行循環一起工作,以將排隊任務和運行循環的其他事件源任務交錯執行。因為它在應用程序的主線程上運行,所以主隊列通常用作應用程序的關鍵同步點。

同步與異步

我們已經學習了如何在隊列上串行或并發地執行任務。使用 GCD,您還可以同步或異步的調度隊列。

一般來說,同步函數(sync)在任務完成后將控制權返回給調用者。而異步函數(async)會在函數調用后,立即將將控制權返回給調用者,它不會等等任務完成。

e2d668da-26f1-11ee-962d-dac502259ad0.jpg

如上圖,您在并發全局隊列上執行耗時的任務,但主線程仍然很忙,因為您在主線程 main 上同步地在分派任務,它會一直等到任務執行完成。

e2ec1824-26f1-11ee-962d-dac502259ad0.jpg

如上圖:我們異步的分派任務,它立即返回到主線程,主線程將首先打印,隊列上的列任務將并發執行。

預防死鎖

在并發計算中,死鎖是一個組的每個成員都在等待另一個成員(包括它自己)采取行動的狀態

e306bb7a-26f1-11ee-962d-dac502259ad0.jpg

在上圖中,queue是一個串行隊列,通過async派發的任務A,通過sync派發了任務B。此時A會等待B完成后繼續向下,而B在A沒有完成之前是不會開始。這就造成了死鎖。

e31cc564-26f1-11ee-962d-dac502259ad0.jpg

同樣,上圖的主隊列任務A(viewDidLoad方法)使用sync派發任務B,也會造成相互等待從而死鎖。

DispatchWorkItem

DispatchWorkItem是一項任務的包裝器,可以多次使用,也可以取消。

letqueue=DispatchQueue(label:"com.swiftpal.dispatch.workItem")

//Createaworkitem
letworkItem=DispatchWorkItem(){
print("StoredTask")
}

//Task1
queue.async(execute:workItem)

//Task2
queue.asyncAfter(deadline:DispatchTime.now()+1,execute:workItem)

//WorkItemCancel
workItem.cancel()

//Task3
queue.async(execute:workItem)

ifitem.isCancelled{
print("Taskwascancelled")
}

這里我們創建了一個串行隊列,又創建了一個DispatchWorkItem,它只包含一句代碼。

接下來,我們在取消任務之前派發了該任務兩次,之后再次派發該任務。但是對于輸出,我們只會看到一次Stored task。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    19404

    瀏覽量

    230992
  • 控制器
    +關注

    關注

    112

    文章

    16444

    瀏覽量

    179229
  • QoS
    QoS
    +關注

    關注

    1

    文章

    136

    瀏覽量

    44873
  • 調度器
    +關注

    關注

    0

    文章

    98

    瀏覽量

    5286

原文標題:Swift 并發編程一

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    并發、并行、進程、線程和協程的區別

    希望的是能一次性預存很多批處理任務進入內存,然后通過一定的處理規則指定(作業調度算法)來讓這些批處理任務劃分CPU的時間,這樣CPU的狀態就像是第一秒執行A任務,第二秒執行B任務,這樣看起來,A任務和B任務就像是同時在進行。這個模式,就叫做
    發表于 08-05 08:24

    Python中的并行性和并發性分析

      在Python編程語言當中,很多人對Python中的并行性和并發性不了解。今天我們將討論python中的并發并行性www.zpedu.
    發表于 08-21 17:45

    Lite Actor:方舟Actor并發模型的輕量級優化

    執行的能力,如圖1所示,在一個時間段中可能有多個任務都處于已啟動運行到運行完畢之間,同時,并發單元也可以在多核設備下并行執行,可以極大地提高多核設備的運行性能。 圖1
    發表于 07-18 12:00

    移動應用高級語言開發——并發探索

    (Actor、函數式編程),具有容錯性好、特定場景性能表現很好且易于維護和測試的優勢,但也存在應用場景有限、不適合細粒度并行等短板。 03?移動應用框架并發 3.1??Dart 語言 Dart是一門新的
    發表于 08-28 17:08

    HarmonyOS如何使用異步并發能力進行開發

    并發是指異步代碼在執行到一定程度后會被暫停,以便在未來某個時間點繼續執行,這種情況下,同一時間只有一段代碼在執行。 ● 多線程并發允許在
    發表于 09-22 17:35

    Java并發編程實戰

    Java并發編程實戰
    發表于 03-19 11:24 ?7次下載

    并行并發哪個好?并行并發的概念和區別

    摘要:并發并行是兩個既相似而又不相同的概念:并發性,又稱共行性,是指能處理多個同時性活動的能力;并行是指同時發生的兩個并發事件,具有
    發表于 12-08 09:12 ?6.6w次閱讀
    <b class='flag-5'>并行</b>和<b class='flag-5'>并發</b>哪個好?<b class='flag-5'>并行</b>和<b class='flag-5'>并發</b>的概念和區別

    七種常見的并發編程模型簡介

    1. 線程與鎖 線程與鎖模型有很多眾所周知的不足,但仍是其他模型的技術基礎,也是很多并發軟件開發的首選。 2. 函數式編程 函數式編程日漸重要的原因之一,是其對并發
    的頭像 發表于 03-15 17:21 ?4716次閱讀

    JAVA并發編程實踐

    JAVA并發編程實踐資料免費下載。
    發表于 06-01 15:31 ?15次下載

    Java并發編程的藝術

    Java并發編程的藝術說明。
    發表于 06-01 15:31 ?16次下載

    用于MCU上的代碼下載與執行并發并行XIP閃存和SRAM設計

    電子發燒友網站提供《用于MCU上的代碼下載與執行并發并行XIP閃存和SRAM設計.zip》資料免費下載
    發表于 09-05 17:14 ?3次下載
    用于MCU上的代碼下載與<b class='flag-5'>執行</b>的<b class='flag-5'>并發</b><b class='flag-5'>并行</b>XIP閃存和SRAM設計

    NVIDIA Triton 系列文章(10):模型并發執行

    前面已經做好了每個推理模型的基礎配置,基本上就能正常讓 Triton 服務器使用這些獨立模型進行推理。接下來的重點,就是要讓設備的計算資源盡可能地充分使用,首先第一件事情就是模型并發執行
    的頭像 發表于 01-05 11:55 ?1187次閱讀

    Java并發包之CAS介紹

    首先,用1000個客戶端進程來模擬并發,并使用信號量Semaphore 控制同時100個線程并發執行,采用同步器CountDownLatch 確保并發線程總數
    的頭像 發表于 06-09 15:55 ?675次閱讀
    Java<b class='flag-5'>并發</b>包之CAS介紹

    shell腳本實現并發多進程

    。 使用xargs命令:xargs命令可以從標準輸入中讀取數據,并將其作為參數傳遞給其他命令。可以將需要并發執行的命令與xargs結合使用,以實現多進程并發
    的頭像 發表于 11-08 10:20 ?1396次閱讀

    操作系統上并行并發的區別

    理解并發、并行的例子 先舉例子來理解這2個概念的區別。 老師讓兩個同學去辦公室談話。如果這兩同學(進程)是并列跨過辦公室門(CPU)的,那么就是并行。如果同學A先進同學B后進入(或者先B后A),或者
    的頭像 發表于 11-09 14:42 ?2150次閱讀
    操作系統上<b class='flag-5'>并行</b>和<b class='flag-5'>并發</b>的區別
    主站蜘蛛池模板: 海角国精产品一区一区三区糖心 | 把腿张开JI巴CAO死你H教室 | 日韩精品一区二区三区AV在线观看 | 伊人影院2019 | 中文在线观看免费网站 | 乌克兰肛交影视 | 久久日本片精品AAAAA国产 | 亚洲国产中文字幕在线视频 | 一区二区乱子伦在线播放 | 麻豆一区二区免费播放网站 | 2020国产成人免费视频 | 日本无码毛片一区二区手机看 | 免费看a毛片| 午夜福利92看看电影80 | 99久久精品毛片免费播放 | 97在线观看成人免费视频 | 亚洲一区在线观看视频 | 日韩在线av免费视久久 | 欧美午夜福利主线路 | 我们日本在线观看免费动漫下载 | 日本高清加勒比 | 国产99视频精品免费播放 | 精品国产品国语在线不卡丶 | 久热在线这里只有精品7 | 毛片免费播放 | 开心久久激情 | 韩国精品无码少妇在线观看网站 | 亚洲精品无码AV中文字幕蜜桃 | 柠檬福利精品视频导航 | 久久有码中文字幕 | 龙岩综合频道 | 亚洲欧洲日韩视频在钱 | 久久理论片 | 国产3级在线观看 | 九九热这里只有精品视频免费 | 久久精品久精品99热 | 宝贝好紧好爽再搔一点试視頻 | 99re久久热在这里精品 | 狠狠久久免费视频在线 | 99精品在线看 | 乱淫67194 |