Swift关键知识点17-并发
00 分钟
2023-9-12
  • 异步或者并行代码能够帮助程序在等待一些需要长时间运行的代码结果的同时运行一些能够快速完成的代码。Swift的异步代码基于线程,但并不保证异步代码运行在哪个线程上。
  • 定义异步函数:使用async关键字,async关键字要写在throws之前。调用异步函数使用await关键字。await关键字代表当前的代码可能会暂停等待其他异步方法或者函数运行
  • 只有以下特定的场景可以调用异步函数或方法
    • 异步函数、方法或属性内
    • 用@main标记的类、枚举类或结构体内的static main()方法
    • Unstructured child task内
  • Task.sleep方法可以用来帮助理解并发
  • 异步序列
  • 同时调用多个异步函数:await使异步函数按照循序执行,async-let可以使异步函数同时执行。两种方式可以互相混合。
  • 任务和任务组:async-let语法创建了子任务。你也可以创建任务组以及属于改组的子任务,给你更多灵活性来控制优先级和取消,以及创建动态数量的任务。同一任务组的任务都属于同一个父任务。每个任务都可以有子任务。任务组和任务这种结构关系也称为结构化并发。
  • 非结构化并发:调用Task.init(priority:operation:)初始化方法创建在当前actor中运行的任务;调用Task.detached(priority:operation:)类方法创建不在当前actor中运行的任务(detached task)。
  • 取消任务:通常取消任务有三种可能的结果,抛出CancellationError,返回nil或者空集合或者返回完成了部份的结果。使用Task.checkCancellation()抛出CancellationError如果任务被取消了,或者检查Task.isCancelled并在你的代码里处理任务取消。通过Task.cancel()手工传播任务取消。
  • Actors:安全地在同时运行的代码间共享信息。actors与类一样是reference types。与类不同的是,actors同时只允许一个任务访问它的可变状态,以保证安全。actor内的方法修改属性不用写await。
  • Sendable Types:在任务或参与者实例内部,程序中包含可变状态(如变量和属性)的部分称为并发域。某些类型的数据无法在并发域之间共享,因为该数据包含可变状态,但它不能防止重叠访问。可以从一个并发域共享到另一个并发域的类型称为可发送类型。满足Sendable协议的类型被声明为可发送,且属于以下三种情况之一
    • 该类型是值类型,其可变状态由其他可发送数据组成
    • 该类型没有任何可变状态,其不可变状态由其他可发送数据组成
    • 该类型具有确保其可变状态安全的代码,例如标记为 @MainActor 的类或在特定线程或队列上序列化对其属性的访问的类。
  • 有些类型始终是可发送的,例如仅具有可发送属性的结构和仅具有可发送关联值的枚举。
  • 要显式地将类型标记为不可发送,使用扩展覆盖对可发送协议的隐式一致性
 

评论