多线程其他模式
多线程其他模式
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
)处理的 具体任务的处理是串行的, 即完成一个任务要依次执行各个阶段, 但从整体任务上看, 不同任务的各个阶段的执行时并行的.
Master-Slave
将一个任务分解为若干个语义等同的子任务, 并由专门的工作者线程来并行执行这些子任务, 既提高计算效率, 又实现了信息隐藏.
Serial Thread Confinement
如果并发任务的执行涉及某个非线程安全对象, 而很多时候我们又不希望因此而引入锁. 通过将多个并发的任务存入队列实现任务的串行化, 并未这些串行化任务创建唯一的工作者线程进行处理.