Swift 并发问题的实用解决方案
Swift 并发可能真的很难使用。 我认为记录和分享你可能遇到的解决方案和陷阱会很有用。 我绝对不是说这是全面的,或者提出的解决方案是完美的。 我也在学习。 非常欢迎大家做出贡献,特别是关于问题!
在整个食谱中引用的陷阱的快速定义
- 时序:有多个选项可用,但会影响事件实际发生的时间。
- 排序:非结构化任务意味着排序取决于调用者。 仔细考虑依赖关系、多次调用和取消。
- 缺乏调用者控制:定义总是控制 Actor 上下文。 这与其他线程模型不同,并且您无法更改您无法控制的定义。
- 可发送性:跨越隔离域的类型必须是可发送的。 这并不总是容易的,并且对于您无法控制的类型,这是不可能的。
- 阻塞:Swift 并发使用固定大小的线程池。 占用后台线程会导致延迟甚至死锁。
- 可用性:并发正在迅速发展,并且某些 API 需要最新的 SDK。
- 异步传染性:将函数设为异步会影响其所有调用点。 这可能会导致大量更改,而每个更改本身都可能影响后续的调用点。
- Actor 重入:多个线程可以进入 Actor 的异步方法。 Actor 的状态可能会在等待期间发生变化。
我很乐意听到你的消息! 通过mastodon、issue 或 pull request 联系。
我更喜欢协作,如果您有类似的项目,我很乐意找到合作的方式。
参与本项目,即表示您同意遵守贡献者行为准则。