多线程其他模式

优质
小牛编辑
134浏览
2023-12-01

多线程其他模式


  • Promise
  • Pipeline
  • Master-Slave
  • Serial Thread Confinement

Promise

所谓Promise, 就是一个对象, 用来传递异步操作的消息. 它代表了某个未来才会知道结果的事件(通常是一个异步操作), 并且这个事件提供统一的API, 可供进一步处理.

对象的状态不受外界影响. Promise对象代表一个异步操作, 有三种状态: Pending(进行中)又称Incomplete Resolved(已完成)又称Fulfilled Rejected(已失败) 只有异步操作的结果, 可以决定当前是哪一种状态, 任何其他操作都无法改变这个状态. 这也是Promise这个名字的由来, 他的英语意思就是承诺, 表示其他手段无法改变.

一旦状态改变, 就不会再变, 任何时候都可以得到这个结果. Promise对象的状态改变, 只有两种可能: 从Pending变为Resolved和从Pending变为Rejected. 只要这两种情况发生, 状态就凝固了, 不会再变了, 会一直保持这个结果.就算改变已经发生了, 你再对Promise对象添加回调函数, 也会立即得到这个结果. 这与事件(Event)完全不同, 事件的特点是, 如果你错过了它, 再去监听, 是得不到结果的.

案例: 两个操作先后依赖, 第二个网络请求需要第一个网络请求的返回值currentUser作为参数

APIClient.fetchCurrentUser(success: { currentUser in
    APIClinet.fetchFollowers(user: currentUser, success: { followers in
        // 得到一个flowwers 数组
    }, failure: { error in
        // 错误处理
    })
}, failure: { error in
    // 错误处理
})

弊端:

  • 在需要多个操作的时候, 会导致多个回调函数嵌套, 导致代码不够直观, 就是常说的Callback Hell
  • 如果几个异步操作之间并没有前后顺序之分(例如不需要前一个请求的结果作为后一个请求的参数)时, 同样需要等待上一个操作完成再实行下一个操作.
  • 丧失了return特性.

使用Promise优化后:

APIClient.fetchCurrentUser()
    .then({ currentUser in
        return APIClient.fetchFollowers(user: currentUser)
    })
    .then({ followers in
        // you now have an array of followers
    })
    .onFailure({ error in
        // hooray, a single failure block!
    })

自己在OC中没有这种使用经历, 在RN开发中有使用过, 的确很好的解决了回调地狱的问题


Pipeline

将一个任务分解为若干个阶段(Stage), 前阶段的输出为下阶段的输入, 各个阶段由不同的工作者线程负责执行. 各个任务的各个阶段是并行(Parallel)处理的 具体任务的处理是串行的, 即完成一个任务要依次执行各个阶段, 但从整体任务上看, 不同任务的各个阶段的执行时并行的. Pipeline


Master-Slave

将一个任务分解为若干个语义等同的子任务, 并由专门的工作者线程来并行执行这些子任务, 既提高计算效率, 又实现了信息隐藏. Master-Slave


Serial Thread Confinement

如果并发任务的执行涉及某个非线程安全对象, 而很多时候我们又不希望因此而引入锁. 通过将多个并发的任务存入队列实现任务的串行化, 并未这些串行化任务创建唯一的工作者线程进行处理.