国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

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

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

前言

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

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

從異步到并發

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

class ProductLoader {
...
func loadFeatured() async throws -> [Product] {
...
}
func loadFavorites() async throws -> [Product] {
...
}
func loadLatest() async throws -> [Product] {
...
}
}

盡管大多數情況下上述每個方法都可能會被單獨調用,但假設在我們應用程序的某些部分中,我們還希望形成一個Recommendations包含這三個ProductLoader方法的所有結果的組合模型:

extension Product {
struct Recommendations {
var featured: [Product]
var favorites: [Product]
var latest: [Product]
}
}

一種方法是使用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
)
}
}

上面的實現確實有效——然而,即使我們的三個加載操作都是完全異步的,它們目前正在按順序執行,一個接一個。因此,盡管我們的頂級loadRecommendations方法相對于我們應用程序的其他代碼正在并發執行,但實際上它還沒有利用并發來執行其內部操作集。

由于我們的產品加載方法不以任何方式相互依賴,因此實際上沒有理由按順序執行它們,所以讓我們看看如何讓它們完全同時執行。

關于如何做到這一點的初步想法可能是將上述代碼簡化為單個表達式,這將使我們能夠使用單個await關鍵字來等待我們的每個操作完成:

extension ProductLoader {
func loadRecommendations() async throws -> Product.Recommendations {
try await Product.Recommendations(
featured: loadFeatured(),
favorites: loadFavorites(),
latest: loadLatest()
)
}
}

然而,即使我們的代碼現在看起來是并發的,它實際上仍會像以前一樣完全按順序執行。

相反,我們需要利用 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
)
}
}

很整齊!因此async let,當我們有一組已知的、有限的任務要執行時,它提供了一種同時運行多個操作的內置方法。但如果不是這樣呢?

任務組

現在假設我們正在開發一個ImageLoader可以讓我們通過網絡加載圖像的工具。要從給定的 加載單個圖像URL,我們可以使用如下所示的方法:

class ImageLoader {
...
func loadImage(from url: URL) async throws -> UIImage {
...
}
}

為了使一次加載一系列圖像變得簡單,我們還創建了一個方便的 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
}
}

現在讓我們說,就像我們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
}
}
}

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

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

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

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

結論

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

責任編輯:姜華 來源: Swift社區
相關推薦

2023-04-26 11:59:06

Swift異步編程

2024-05-17 09:04:20

PHP異步并行

2023-11-06 14:13:51

asyncio開發

2024-11-27 13:25:24

Rust線程池線程

2025-03-21 09:01:34

Swift任務取消機制協作式取消

2019-07-26 09:20:21

ClusterShel命令Linux

2024-12-16 17:00:00

并行并發Java

2009-10-27 09:12:50

Visual Stud

2024-04-17 08:05:18

C#并發設計

2009-08-04 14:48:26

并發和并行的區別

2012-04-06 10:31:44

Java

2025-03-19 09:02:18

Debouncing任務讓步Swift

2022-11-03 16:00:10

2022-11-13 15:48:19

編程線程GPU

2022-10-24 09:02:28

Selenium自動化

2025-07-22 17:59:41

2019-07-11 10:00:29

串行并行并發

2010-03-04 09:10:34

Linux Chrom

2014-02-12 13:43:50

代碼并行任務

2021-11-30 00:12:43

C#多線程循環
點贊
收藏

51CTO技術棧公眾號

国产精品嫩草久久久久| 日本高清不卡aⅴ免费网站| 国产精品精品久久久| 91亚洲天堂| 一区二区三区视频在线观看| 少妇高潮毛片色欲ava片| 久久这里有精品15一区二区三区| 成人网在线观看| 日本a口亚洲| 国产美女精彩久久| 精品国产精品| 国产精品久在线观看| 欧美一区二区三区久久| 国色天香2019中文字幕在线观看| 超碰国产精品一区二页| 在线电影中文日韩| 欧美xnxx| 久久成人亚洲精品| 天天综合91| 久久精品久久久久| 国产精品伦一区二区| 亚洲第一网站免费视频| 福利视频在线看| 欧美日韩免费视频| 免费大片黄在线观看视频网站| 91久久精品一区二区三区| 高清日韩av电影| 91精品在线麻豆| 日本不卡1234视频| 亚洲色图第一页| 国语自产精品视频在线看抢先版结局 | av永久不卡| 91在线精品播放| 99国产成+人+综合+亚洲欧美| 欧美日本韩国国产| 免费欧美在线视频| 可以看毛片的网址| 国产精品每日更新在线播放网址| av手机免费观看| 欧美日韩性视频在线| 蜜桃视频在线观看www社区| 精品少妇一区二区三区日产乱码| www.亚洲在线| 国产爆乳无码一区二区麻豆 | 日韩欧美在线看| 免费观看视频www| 亚洲精品视频在线看| 97久久精品国产| 91亚洲国产高清| 裸模一区二区三区免费| 韩国精品一区二区| 国产精品免费观看久久| 亚洲亚洲精品在线观看| 日本在线看片免费人成视1000| 精品亚洲va在线va天堂资源站| 欧美成人精品午夜一区二区| 91精品国产自产在线| 日本欧美一区二区在线观看| 国产成人a亚洲精v品无码| 午夜精品久久久久久久蜜桃app| av网站在线免费| 欧美日韩国产123| 欧美日韩四区| 国产免费黄色小视频| 亚洲成人一区在线| 九色porny视频在线观看| 97视频com| 丝袜美腿亚洲一区| 97在线资源在| 久久婷婷五月综合色丁香| 欧美午夜在线播放| 2021久久精品国产99国产精品| 欧美日韩免费| 欧美狂野激情性xxxx在线观| 亚洲另类春色国产| av电影免费在线看| 538国产精品视频一区二区| 国产精品人人爽人人做我的可爱| 欧美色图色综合| 欧美性猛交xxxx免费看| 国产精品久久久久77777丨| 91久久久久久久| 成人精品视频一区二区三区尤物| 视频国产在线观看| 久久亚洲国产精品| 亚洲视频免费| 波多野结衣作品集| 日韩欧美一级片| 久久99精品国产自在现线| 日韩欧美三级一区二区| 亚洲综合成人在线| av在线亚洲一区| 偷拍视频一区二区| 欧美性猛交xxxx富婆| 91精品入口| 日本福利视频在线观看| 欧美男生操女生| 欧美丝袜激情| 一级在线免费视频| 亚洲欧洲在线播放| 久久不射2019中文字幕| 人成在线免费视频| 日韩女在线观看| 国产午夜精品一区二区三区四区| 草草视频在线观看| 就去色蜜桃综合| 精品国产乱码久久久久久天美| 一区二区三区亚洲变态调教大结局| 亚洲精品第一区二区三区| 欧美三级视频在线观看| 香蕉久久网站| h色视频在线观看| 久久男人的天堂| 2019国产精品| 欧美黄色a视频| 日韩不卡一二区| 亚洲级视频在线观看免费1级| 一本久道久久久| 成年在线电影| 成人9ⅰ免费影视网站| 亚洲一区二区在线免费看| 国产精品超碰| the porn av| 欧美乱大交xxxxx另类电影| www.日韩精品| 色综合视频一区二区三区日韩| 一区二区三视频| 亚洲福利在线看| 精品一区二区在线播放| 国产精品186在线观看在线播放| 欧美日韩精品免费观看视一区二区| 欧美亚洲精品一区| 国产蜜臀在线| 尤物精品国产第一福利三区| 青娱乐精品视频| 日本aa在线| 久久国产主播精品| 欧美亚洲日本国产| 亚洲人成人一区二区三区| 北岛玲日韩精品一区二区三区| 91亚洲精品丁香在线观看| 一本久久a久久精品亚洲| 欧美激情视频一区二区三区免费| 国产天堂在线| 国内外成人免费视频| 91精品国产色综合久久ai换脸| 久久免费高清| 激情aⅴ欧美一区二区欲海潮| 51xx午夜影福利| 北条麻妃在线一区二区| 久久精品人人做| 亚洲精品合集| 神马久久久久| 精品毛片久久久久久| 亚洲成人亚洲激情| 99久精品国产| 欧美尿孔扩张虐视频| x88av蜜桃臀一区二区| av激情久久| 亚洲精品视频免费在线观看| 91丨porny丨中文| 精品久久久久中文字幕小说| 97视频在线观看网站| 国产精品99久久久久久大便| 北条麻妃一区二区三区中文字幕| 国产精品无圣光一区二区| 五月激情久久久| aaa在线播放视频| 日本成年人网址| 国产精品视频区| 精品日韩99亚洲| 国产日韩av一区二区| 中文精品久久| 欧美艳星kaydenkross| 超级污的网站| 国产精选在线观看91| 亚洲色图50p| 亚洲人亚洲人成电影网站色| 欧美国产先锋| 综合在线影院| 原千岁中文字幕| 中国成人在线视频| 日本午夜人人精品| 欧美一区二区三区电影| 国产日韩一级二级三级| 97精品一区| 欧美最新精品| 最近2018年手机中文在线| 日韩电影免费观看在| 午夜精品久久久久久久99黑人 | 国内一区二区三区在线视频| 国产亚洲精品久久久久久牛牛| 一区二区三区成人在线视频| 日韩电影在线看| 国产精品嫩草影院在线看| 丁香花在线影院| 中文字幕97| 91九色丨porny丨国产jk| 成人永久免费| 欧美肥老妇视频|