WWDC21-Swift中的结构化并发

一、引言

        在Swift5.5引入了受结构化编程思维影响的结构化并发的并发编程方式。
        以下是一个使用传统的回调通知来实现的异步编程实例



        在此种编程模式下,具有以下一些劣势:

  • 不能使用错误处理
  • 不能使用for循环来处理所有的图片
  • 不容易理解等

        以下是使用新的结构化并发编程的方式来还原原来的功能。


注意
关于此基于结构化并发的新的实现方式中设计到的async、await等关键字,如果读者不理解的话,建议参与本作者其他的WWDC21文章。

        可以看出此函数与上面的实现方式相比具有较大的进步

  • 可以抛出错误
  • 具有返回值
  • 没有使用递归
  • 代码更容易理解
            虽然基于结构化并发的代码比传统的代码要好很多,但是,还开更好!目前的代码中下载缩略图是串行进行的——下载一个图片、生成一个缩略图,这无法充分利用多核设备的能力。可以使用Swift5.5中的Task(任务)来进一步增强代码的能力。
  • 任务提供了一个并发执行代码的上下文
  • Swift编译器对代码进行检查,可以避免并发错误
  • 任务必须被明确的创建(编译器不会隐式创建任务)

二、任务详解

2.1 Async-let 任务

        这是一个普通的绑定,这个流程对于大部分里了解Swift读者都是比较熟悉的。



        通过添加async关键字,则创建了一个Async-let任务,以下流程图描述了此执行流程。


        以下是一个Async-let任务的实例。



        fetchOneThumbnail函数是一个父任务,两个async-let语句创建了两个子任务。父任务在子任务完成后才能完成;如果一个子任务抛出异常,另外一个子任务被标记为取消的,但是其子任务还是会运行。任务如果被取消,则其所有的子任务也被取消。

2.2 组任务

        使用withThrowingTaskGroup 函数来创建任务组,任务组能够处理并发任务数量不确定的情况。添加到组内的子任务可以以任何顺序执行。


注意
在上面的.group.async中对thumbnails[id]的赋值会引发问题(多线程的问题)

2.3 任务总结

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章