区块链技术博客
www.b2bchain.cn

【WWDC21 10133】并发编程新利器 – Actor求职学习资料

本文介绍了【WWDC21 10133】并发编程新利器 – Actor求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

作者:夏了南城,一名iOS/Flutter开发者。

审核:四娘,iOS 开发,老司机技术周报成员。目前就职于格隆汇,对 Swift 和编译器相关领域感兴趣

【WWDC21  10133】并发编程新利器 - Actor

数据竞争在并发编程中是一个让人头疼的问题,造成这种问题的原因主要是同一个资源被多个并发任务同时进行读写操作。那么解决这种问题的方式我们主要是用同步或者加锁,这两种方式用起来都需要非常小心,否则会造成死锁。在今年 WWDC 大会中给我们带来一种新的避免数据竞争的方式,今天我们看一下这种新的方式 – Actor。

本文基于 WWDC21 Session 10133 梳理。

Actor

数据竞争

在并发编程中,多个并发任务访问同一个数据的时候,很容易造成数据竞争,我们先看一下下面的代码:

class Counter {     var value = 0      func increment() -> Int {         value = value + 1         return value     } }  let counter = Counter() asyncDeteched {     print(counter.increment()) // 1 or 2 }  asyncDeteched {     print(counter.increment()) // 1 or 2 }

我们可以发现在多线程中在不同的时机操作 value,输出的结果有可能是11,也有可能是22,这就造成了数据竞争。如何避免这种问题出现呢?答案是 Actor,Swift5.5 里为我们带来了新的并发计算模型。

Actor 是一个和 class 类型很相似的新类型,它可以保证在并发环境中,可变状态被访问的安全性,它只在内部维护自己的可变状态,外部访问 Actor 内部数据的时候,会按顺序来处理。可能对于 iOS 开发者来说,最直白但不准确的理解方式,就是把每个 actor 都当成是一个后端服务:

  1. 我们没办法直接访问它在内存里的数据(actor isolation);

  2. 只能给它发消息请求(mail),调用它规定好的接口(behavior);

  3. 这台服务器会按顺序逐一去处理这些消息请求(mailbox + FIFO),避免并发访问自己的内部数据。

这样保证了访问数据的安全性,解决了并发环境带来的问题。

Actor Types

在 Swift 中 Actor 是和 Class 一样是引用类型,也有属性,方法,下标,遵守协议等功能,但是在静态方法中是没有 self 的,所以不涉及到数据的隔离。

Actor 和 Class 区别在于 Actor 遵守了 Actor 协议,可以保证在并发环境下操作数据的安全性,而且 Actor 不支持继承,使得 Actor 使用起来很简单。所以 Actor 没有重写方法的能力,这在未来可能会改变。

Actor 声明是用 actor 关键字,下面我们看一下用 actor 来解决上面问题。

actor Counter {     var value = 0      func increment() -> Int {         value = value + 1         return value     } }  let counter = Counter() asyncDeteched {     print(counter.increment()) // 1 or 2 }  asyncDeteched {     print(counter.increment()) // 2 or 1 }

这样在actor的隔离中,在多个并发任务中,保证资源被访问的同步性,在一个并发任务访问的时候,另一个在等待,两个任务依次访问,不会造成数据的竞争,输出的结果也是 1 1 或者 2 2

Actor isolation

在 Actor 中防止数据竞争的主角就是 Actor Isolation,在 Actor 中主要的保护机制就是只有 self 可以直接访问内部存储变量,在外部访问是不被允许的。如果我们给 Count 增加一个减法的操作,并操作了另一个 Actor 的 value 变量,这样在编译器层面就报错了。

extension Counter{     func subtract(other: Counter) throws {         other.value = other.value - value  // 错误: 'value' 属性只能被 'self' 引用     } }

在上面的代码我们看到一个错误:”被隔离的属性 value 只能被 self 引用”,这告诉我们在 actor 声明的存储变量和方法都是被 actor-isolated 隔离的,只能被 self 访问,跨 actor 边界传递非 sendable 类型会报一个错误。产生错误的原因就是 value 是可变的存储变量,other.value 不是通过 self 访问的,在编译器层面就是不通过的,在 actor 之间可以传递的只能是 Sendable 类型。

可重入性

作者:夏了南城,一名iOS/Flutter开发者。

审核:四娘,iOS 开发,老司机技术周报成员。目前就职于格隆汇,对 Swift 和编译器相关领域感兴趣

【WWDC21  10133】并发编程新利器 - Actor

数据竞争在并发编程中是一个让人头疼的问题,造成这种问题的原因主要是同一个资源被多个并发任务同时进行读写操作。那么解决这种问题的方式我们主要是用同步或者加锁,这两种方式用起来都需要非常小心,否则会造成死锁。在今年 WWDC 大会中给我们带来一种新的避免数据竞争的方式,今天我们看一下这种新的方式 – Actor。

本文基于 WWDC21 Session 10133 梳理。

Actor

数据竞争

在并发编程中,多个并发任务访问同一个数据的时候,很容易造成数据竞争,我们先看一下下面的代码:

class Counter {     var value = 0      func increment() -> Int {         value = value + 1         return value     } }  let counter = Counter() asyncDeteched {     print(counter.increment()) // 1 or 2 }  asyncDeteched {     print(counter.increment()) // 1 or 2 }

我们可以发现在多线程中在不同的时机操作 value,输出的结果有可能是11,也有可能是22,这就造成了数据竞争。如何避免这种问题出现呢?答案是 Actor,Swift5.5 里为我们带来了新的并发计算模型。

Actor 是一个和 class 类型很相似的新类型,它可以保证在并发环境中,可变状态被访问的安全性,它只在内部维护自己的可变状态,外部访问 Actor 内部数据的时候,会按顺序来处理。可能对于 iOS 开发者来说,最直白但不准确的理解方式,就是把每个 actor 都当成是一个后端服务:

  1. 我们没办法直接访问它在内存里的数据(actor isolation);

  2. 只能给它发消息请求(mail),调用它规定好的接口(behavior);

  3. 这台服务器会按顺序逐一去处理这些消息请求(mailbox + FIFO),避免并发访问自己的内部数据。

这样保证了访问数据的安全性,解决了并发环境带来的问题。

Actor Types

在 Swift 中 Actor 是和 Class 一样是引用类型,也有属性,方法,下标,遵守协议等功能,但是在静态方法中是没有 self 的,所以不涉及到数据的隔离。

Actor 和 Class 区别在于 Actor 遵守了 Actor 协议,可以保证在并发环境下操作数据的安全性,而且 Actor 不支持继承,使得 Actor 使用起来很简单。所以 Actor 没有重写方法的能力,这在未来可能会改变。

Actor 声明是用 actor 关键字,下面我们看一下用 actor 来解决上面问题。

actor Counter {     var value = 0      func increment() -> Int {         value = value + 1         return value     } }  let counter = Counter() asyncDeteched {     print(counter.increment()) // 1 or 2 }  asyncDeteched {     print(counter.increment()) // 2 or 1 }

这样在actor的隔离中,在多个并发任务中,保证资源被访问的同步性,在一个并发任务访问的时候,另一个在等待,两个任务依次访问,不会造成数据的竞争,输出的结果也是 1 1 或者 2 2

Actor isolation

在 Actor 中防止数据竞争的主角就是 Actor Isolation,在 Actor 中主要的保护机制就是只有 self 可以直接访问内部存储变量,在外部访问是不被允许的。如果我们给 Count 增加一个减法的操作,并操作了另一个 Actor 的 value 变量,这样在编译器层面就报错了。

extension Counter{     func subtract(other: Counter) throws {         other.value = other.value - value  // 错误: 'value' 属性只能被 'self' 引用     } }

在上面的代码我们看到一个错误:”被隔离的属性 value 只能被 self 引用”,这告诉我们在 actor 声明的存储变量和方法都是被 actor-isolated 隔离的,只能被 self 访问,跨 actor 边界传递非 sendable 类型会报一个错误。产生错误的原因就是 value 是可变的存储变量,other.value 不是通过 self 访问的,在编译器层面就是不通过的,在 actor 之间可以传递的只能是 Sendable 类型。

可重入性

作者:夏了南城,一名iOS/Flutter开发者。

审核:四娘,iOS 开发,老司机技术周报成员。目前就职于格隆汇,对 Swift 和编译器相关领域感兴趣

【WWDC21  10133】并发编程新利器 - Actor

数据竞争在并发编程中是一个让人头疼的问题,造成这种问题的原因主要是同一个资源被多个并发任务同时进行读写操作。那么解决这种问题的方式我们主要是用同步或者加锁,这两种方式用起来都需要非常小心,否则会造成死锁。在今年 WWDC 大会中给我们带来一种新的避免数据竞争的方式,今天我们看一下这种新的方式 – Actor。

本文基于 WWDC21 Session 10133 梳理。

Actor

数据竞争

在并发编程中,多个并发任务访问同一个数据的时候,很容易造成数据竞争,我们先看一下下面的代码:

class Counter {     var value = 0      func increment() -> Int {         value = value + 1         return value     } }  let counter = Counter() asyncDeteched {     print(counter.increment()) // 1 or 2 }  asyncDeteched {     print(counter.increment()) // 1 or 2 }

我们可以发现在多线程中在不同的时机操作 value,输出的结果有可能是11,也有可能是22,这就造成了数据竞争。如何避免这种问题出现呢?答案是 Actor,Swift5.5 里为我们带来了新的并发计算模型。

Actor 是一个和 class 类型很相似的新类型,它可以保证在并发环境中,可变状态被访问的安全性,它只在内部维护自己的可变状态,外部访问 Actor 内部数据的时候,会按顺序来处理。可能对于 iOS 开发者来说,最直白但不准确的理解方式,就是把每个 actor 都当成是一个后端服务:

  1. 我们没办法直接访问它在内存里的数据(actor isolation);

  2. 只能给它发消息请求(mail),调用它规定好的接口(behavior);

  3. 这台服务器会按顺序逐一去处理这些消息请求(mailbox + FIFO),避免并发访问自己的内部数据。

这样保证了访问数据的安全性,解决了并发环境带来的问题。

Actor Types

在 Swift 中 Actor 是和 Class 一样是引用类型,也有属性,方法,下标,遵守协议等功能,但是在静态方法中是没有 self 的,所以不涉及到数据的隔离。

Actor 和 Class 区别在于 Actor 遵守了 Actor 协议,可以保证在并发环境下操作数据的安全性,而且 Actor 不支持继承,使得 Actor 使用起来很简单。所以 Actor 没有重写方法的能力,这在未来可能会改变。

Actor 声明是用 actor 关键字,下面我们看一下用 actor 来解决上面问题。

actor Counter {     var value = 0      func increment() -> Int {         value = value + 1         return value     } }  let counter = Counter() asyncDeteched {     print(counter.increment()) // 1 or 2 }  asyncDeteched {     print(counter.increment()) // 2 or 1 }

这样在actor的隔离中,在多个并发任务中,保证资源被访问的同步性,在一个并发任务访问的时候,另一个在等待,两个任务依次访问,不会造成数据的竞争,输出的结果也是 1 1 或者 2 2

Actor isolation

在 Actor 中防止数据竞争的主角就是 Actor Isolation,在 Actor 中主要的保护机制就是只有 self 可以直接访问内部存储变量,在外部访问是不被允许的。如果我们给 Count 增加一个减法的操作,并操作了另一个 Actor 的 value 变量,这样在编译器层面就报错了。

extension Counter{     func subtract(other: Counter) throws {         other.value = other.value - value  // 错误: 'value' 属性只能被 'self' 引用     } }

在上面的代码我们看到一个错误:”被隔离的属性 value 只能被 self 引用”,这告诉我们在 actor 声明的存储变量和方法都是被 actor-isolated 隔离的,只能被 self 访问,跨 actor 边界传递非 sendable 类型会报一个错误。产生错误的原因就是 value 是可变的存储变量,other.value 不是通过 self 访问的,在编译器层面就是不通过的,在 actor 之间可以传递的只能是 Sendable 类型。

可重入性

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 【WWDC21 10133】并发编程新利器 – Actor求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们