美文网首页
WWDC21-Swift中的结构化并发

WWDC21-Swift中的结构化并发

作者: 行知路 | 来源:发表于2021-06-13 16:15 被阅读0次

    一、引言

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


    传统的异步编程

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

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

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


    结构化异常处理

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

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

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

    二、任务详解

    2.1 Async-let 任务

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


    普通绑定

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


    异步绑定

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


    具有并发能力的异步let绑定

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

    2.2 组任务

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


    任务组

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

    使用此方法规避多线程的问题

    2.3 任务总结

    相关文章

      网友评论

          本文标题:WWDC21-Swift中的结构化并发

          本文链接:https://www.haomeiwen.com/subject/knfgeltx.html