国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

Swift 的并發系統并行運行多個任務

? 來源:jf_57394773 ? 作者:jf_57394773 ? 2025-11-11 11:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

??前言
Swift 內置并發系統的好處之一是它可以更輕松地并行執行多個異步任務,這反過來又可以使我們顯著加快可以分解為單獨部分的操作。

在本文中,讓我們看一下幾種不同的方法,以及這些技術中的每一種何時特別有用。

從異步到并發
首先,假設我們正在開發某種形式的購物應用程序來顯示各種產品,并且我們已經實現了一個ProductLoader允許我們使用一系列異步 API 加載不同產品集合的應用程序,如下所示:

class ProductLoader {
   ...

   func loadFeatured() async throws -> [Product] {
       ...
   }
   
   func loadFavorites() async throws -> [Product] {
       ...
   }
   
   func loadLatest() async throws -> [Product] {
       ...
   }
}
AI寫代碼
盡管大多數情況下上述每個方法都可能會被單獨調用,但假設在我們應用程序的某些部分中,我們還希望形成一個Recommendations包含這三個ProductLoader方法的所有結果的組合模型:
extension Product {
   struct Recommendations {
       var featured: [Product]
       var favorites: [Product]
       var latest: [Product]
   }
}
AI寫代碼
一種方法是使用await關鍵字調用每個加載方法,然后使用這些調用的結果來創建我們Recommendations模型的實例——如下所示:
extension ProductLoader {
   func loadRecommendations() async throws -> Product.Recommendations {
       let featured = try await loadFeatured()
let favorites = try await loadFavorites()
let latest = try await loadLatest()
       
       return Product.Recommendations(
           featured: featured,
           favorites: favorites,
           latest: latest
       )
   }
}
AI寫代碼
上面的實現確實有效——然而,即使我們的三個加載操作都是完全異步的,它們目前正在按順序執行,一個接一個。因此,盡管我們的頂級loadRecommendations方法相對于我們應用程序的其他代碼正在并發執行,但實際上它還沒有利用并發來執行其內部操作集。
由于我們的產品加載方法不以任何方式相互依賴,因此實際上沒有理由按順序執行它們,所以讓我們看看如何讓它們完全同時執行。
關于如何做到這一點的初步想法可能是將上述代碼簡化為單個表達式,這將使我們能夠使用單個await關鍵字來等待我們的每個操作完成:
extension ProductLoader {
   func loadRecommendations() async throws -> Product.Recommendations {
       try await Product.Recommendations(
           featured: loadFeatured(),
           favorites: loadFavorites(),
           latest: loadLatest()
       )
   }
}
AI寫代碼
然而,即使我們的代碼現在看起來是并發的,它實際上仍會像以前一樣完全按順序執行。
相反,我們需要利用 Swift 的async let綁定來告訴并發系統并行執行我們的每個加載操作。使用該語法使我們能夠在后臺啟動異步操作,而無需我們立即等待它完成。
await如果我們在實際使用加載的數據時(即形成模型時)將其與單個關鍵字組合Recommendations,那么我們將獲得并行執行加載操作的所有好處,而無需擔心狀態管理或數據競爭之類的事情:
extension ProductLoader {
   func loadRecommendations() async throws -> Product.Recommendations {
       async let featured = loadFeatured()
async let favorites = loadFavorites()
async let latest = loadLatest()
       
       return try await Product.Recommendations(
           featured: featured,
           favorites: favorites,
           latest: latest
       )
   }
}
AI寫代碼
很整齊!因此async let,當我們有一組已知的、有限的任務要執行時,它提供了一種同時運行多個操作的內置方法。但如果不是這樣呢?
任務組
現在假設我們正在開發一個ImageLoader可以讓我們通過網絡加載圖像的工具。要從給定的 加載單個圖像URL,我們可以使用如下所示的方法:
class ImageLoader {
   ...

   func loadImage(from url: URL) async throws -> UIImage {
       ...
   }
}
AI寫代碼
為了使一次加載一系列圖像變得簡單,我們還創建了一個方便的 API,它接受一個 URL 數組并異步返回一個圖像字典,該字典由下載圖像的 URL 鍵控:
extension ImageLoader {
   func loadImages(from urls: [URL]) async throws -> [URL: UIImage] {
       var images = [URL: UIImage]()
       
       for url in urls {
           images[url] = try await loadImage(from: url)
       }
       
       return images
   }
}
AI寫代碼
現在讓我們說,就像我們ProductLoader之前的工作一樣,我們想讓上面的loadImages方法并發執行,而不是按順序下載每個圖像(目前是這種情況,因為我們await在調用時直接使用loadImage我們的for環形)。
但是,這次我們將無法使用async let,因為我們需要執行的任務數量在編譯時是未知的。值得慶幸的是,Swift 并發工具箱中還有一個工具可以讓我們并行執行動態數量的任務——任務組。
要形成一個任務組,我們可以調用withTaskGroup或withThrowingTaskGroup,這取決于我們是否希望可以選擇在我們的任務中拋出錯誤。在這種情況下,我們將選擇后者,因為我們的底層loadImage方法是用throws關鍵字標記的。
然后我們將遍歷每個 URL,就像以前一樣,只是這次我們將每個圖像加載任務添加到我們的組中,而不是直接等待它完成。相反,我們將await在添加每個任務之后單獨分組結果,這將允許我們的圖像加載操作完全并發執行:
extension ImageLoader {
   func loadImages(from urls: [URL]) async throws -> [URL: UIImage] {
       try await withThrowingTaskGroup(of: (URL, UIImage).self) { group in
           for url in urls {
               group.addTask{
   let image = try await self.loadImage(from: url)
   return (url, image)
}
           }
           
           var images = [URL: UIImage]()
           
           for try await (url, image) in group {
   images[url] = image
}
           
           return images
       }
   }
}
AI寫代碼

要了解有關上述for try await語法和一般異步序列的更多信息,請查看“異步序列、流和組合”。

就像使用 時一樣async let,以我們的操作不會直接改變任何狀態的方式編寫并發代碼的一個巨大好處是,這樣做可以讓我們完全避免任何類型的數據競爭問題,同時也不需要我們引入任何鎖定或序列化代碼混合在一起。

await因此,在可能的情況下,讓我們的每個并發操作返回一個完全獨立的結果,然后依次返回這些結果以形成我們的最終數據集,這通常是一種很好的方法。

在以后的文章中,我們將更仔細地研究避免數據競爭的其他方法(例如通過使用 Swift 的新actor類型)。

結論
重要的是要記住,僅僅因為給定的函數被標記為async并不一定意味著它同時執行它的工作。相反,如果這是我們想要做的,我們必須故意讓我們的任務并行運行,這只有在執行一組可以獨立運行的操作時才有意義。

審核編輯 黃宇

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

    關注

    2

    文章

    2368

    瀏覽量

    66752
  • SWIFT
    +關注

    關注

    0

    文章

    125

    瀏覽量

    24783
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    在睿思芯科靈羽RISC-V服務器CPU實現多實例OpenClaw并發運行

    睿思芯科基于自研“靈羽“系列服務器CPU實測單板承載多實例OpenClaw并發運行。基于標準Linux+Docker環境并行響應不同業務需求,為企業未來的大規模Al Agent托管打開了更優單位算力成本的新路
    的頭像 發表于 02-11 09:37 ?461次閱讀
    在睿思芯科靈羽RISC-V服務器CPU實現多實例OpenClaw<b class='flag-5'>并發運行</b>

    一文說透了如何實現單片機的多任務并發

    任務并發。 一、任務調度 任務調度是多任務并發中一個非常重要的概念。它指的是如何在
    發表于 01-06 06:46

    解析Linux的進程、線程和協程

    允許在單個線程內實現多個協程的并發執行。協程在執行過程中可以主動掛起和恢復,這使得編寫高效的異步代碼變得更加容易。協程通常用于處理I/O密集型任務,能夠提高程序的響應性能。 協程的特點包括: (1
    發表于 12-22 11:00

    高性能網絡存儲設計:NVMe-oF IP的實現探討

    Initiator 并發訪問支持(Multi-Initiator Sharing) 系統從協議棧到調度機制均支持多個 Initiator(多個客戶端)同時訪問單個Target: ?每
    發表于 12-19 18:45

    并行智能體:洞察復雜系統的 14 種并發設計模式

    在AI智能體的世界中,速度、質量和可靠性不僅僅是特性,它們是必備條件。一個單一、順序執行的智能體可能速度慢、容易出錯,并且解決問題的能力有限。解決方案是采用并行思維:設計一個系統,讓多個智能體、流程
    的頭像 發表于 12-02 15:07 ?592次閱讀
    <b class='flag-5'>并行</b>智能體:洞察復雜<b class='flag-5'>系統</b>的 14 種<b class='flag-5'>并發</b>設計模式

    Linux多線程對比單線程的優勢

    在Linux系統中,線程是操作系統能夠進行運算調度的最小單位。線程被包含在進程之中,是進程中的實際運行單位。一個進程可以擁有多個線程,這些線
    發表于 12-01 06:11

    【HZ-T536開發板免費體驗】—— linux創建線程

    的執行任務成為單線程。多線程是程序中包含多個執行流,在一個程序中可以同時運行多個不同的線程來執行不同的任務。 多線程提高了CPU的使用鹵率。
    發表于 09-01 21:31

    Task任務:LuatOS實現“任務并發”的核心引擎

    Task任務通過其強大的并發處理能力,使LuatOS能夠在單線程環境中模擬多線程執行,通過協程的掛起與恢復機制,實現任務級的并行操作,顯著提升系統
    的頭像 發表于 08-28 13:49 ?507次閱讀
    Task<b class='flag-5'>任務</b>:LuatOS實現“<b class='flag-5'>任務</b>級<b class='flag-5'>并發</b>”的核心引擎

    第三屆大會回顧第3期 | FFRT并發框架在OpenHarmony中的設計與實踐

    ,特別是在多核處理器上,可以顯著提高程序的運行速度和整體性能,從而改善用戶體驗。OpenHarmony的FFRT并發編程模型為開發者提供了構建異步并發任務的能力,以更高效地開發和管理
    的頭像 發表于 06-21 16:53 ?1265次閱讀
    第三屆大會回顧第3期 | FFRT<b class='flag-5'>并發</b>框架在OpenHarmony中的設計與實踐

    同步任務開發指導

    同步任務是指在多個線程之間協調執行的任務,其目的是確保多個任務按照一定的順序和規則執行,例如使用鎖來防止數據競爭。 同步
    發表于 06-19 07:57

    I/O密集型任務開發指導

    能力,而在于I/O操作的速度和效率。這種任務通常需要頻繁地進行磁盤讀寫、網絡通信等操作。此處以頻繁讀寫系統文件來模擬I/O密集型并發任務的處理。 定義
    發表于 06-19 07:19

    鴻蒙5開發寶藏案例分享---應用并發設計

    1:耗時任務并發——圖片解碼加速 痛點 :主線程解碼4K圖片導致界面卡死 // 步驟1:定義并發函數 @Concurrent function decodeImage(imageData
    發表于 06-12 16:19

    CRC16-MODBUS+手算+移位運算+C程序+并行運

    CRC16-MODBUS+手算+移位運算+C程序+并行運
    發表于 04-22 18:23 ?0次下載

    讀懂極易并行計算:定義、挑戰與解決方案

    GPU經常與人工智能同時提及,其中一個重要原因在于AI與3D圖形處理本質上屬于同一類問題——它們都適用極易并行計算。什么是極易并行計算?極易并行計算指的是符合以下特征的計算任務
    的頭像 發表于 04-17 09:11 ?812次閱讀
    讀懂極易<b class='flag-5'>并行</b>計算:定義、挑戰與解決方案

    如何使用S32DS在MPC5775B中并行運行兩個內核(core0 和 core2)?

    誰能幫我了解如何使用 S32DS 在 MPC5775B 中并行運行兩個內核(core0 和 core2)?
    發表于 03-31 06:27