Swift新async/await并发模型中子任务取消不能被其它子任务感知的原因及解决

Posted 大熊猫侯佩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift新async/await并发模型中子任务取消不能被其它子任务感知的原因及解决相关的知识,希望对你有一定的参考价值。



问题现象

Swift 5.5 新引入的 async/await 并发模型,使用结构化并发(Structured Concurrency)模式,极大地改变了Swift并行代码开发的游戏规则。

了解 async/await 并发模型的小伙伴们都知道,Swift本质上是将并发任务转换为继承体系中的Task组来实现结构化并发的。

其中,关于Task和其子任务的一个特性是:当同一个Task中的任意子任务抛出异常或取消时,其它子任务都可以感知到这一行为:

If one of your child tasks throws an uncaught error, all remaining tasks will be implicitly cancelled.

子任务可以通过检查 Task.isCancelled 值或调用 Task.checkCancellation() 方法来完成感知。

不过,该特性触发需要一个隐藏条件,在本篇博文中我们就来详细讨论下如何让子任务取消可以被其它兄弟子任务所感知吧。

废话少叙,Let’s do it!

以上是关于Swift新async/await并发模型中子任务取消不能被其它子任务感知的原因及解决的主要内容,如果未能解决你的问题,请参考以下文章

Swift 两种方式实现 async/await 并发模型中任务超时(timeout)的处理

Swift 两种方式实现 async/await 并发模型中任务超时(timeout)的取消

Swift 两种方式实现 async/await 并发模型中任务超时(timeout)的取消

Swift 新并发框架之 async/await

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题