在ReactiveX范例中,处理线程安全是消费者(IObserver
)的责任吗?
。,如果OnCompleted
调用出现时,OnNext
仍在另一个线程上执行?
看起来像是来自Rx . net的源代码,但是文档有些模糊。
自从我最初在推特上问这个问题以来,我相信我现在已经找到了一个权威的答案。
看来我的假设是错误的,即线程安全的序列化是消费者的责任(IObserver
)。
根据原始的Rx设计指南文档(看起来是最好的秘密)
4.2。假设以序列化方式调用观察者实例
由于Rx使用push模型,而。net支持多线程,所以它是不同的消息可能到达不同的执行上下文同时。如果可观察序列的消费者不得不在每个地方处理这个问题,他们的代码将需要执行很多的内务管理,以避免常见的并发问题。用英语编写的代码这种方式很难维护,而且可能会受到影响性能问题。
进一步:
6.7。序列化调用
IObserver
方法在可观察序列实现Rx是一个可组合的API,许多操作符可以发挥在一起。如果所有操作符都必须处理并发性,那么单个操作符操作者会变得非常复杂。其次,并发性是最好的在最初发生的地方控制。最后,使用Rx API如果每次使用Rx都必须处理并发性。
最后:
6.8。由于所有Rx操作符都被绑定到准则6.7,操作符可以安全地假设它们的输入是序列化的。添加过多的同步会使代码变得混乱可能导致性能下降。如果一个可观察序列不是遵循Rx契约(参见第0章),这取决于开发人员编写最终用户应用程序来修复可观察序列在开发人员到达的第一个位置调用
Synchronize
操作符持有可观察序列。这样范围就增加了同步被限制在需要的地方。
我个人的看法是:如果产生IObservable
的原始序列在调用OnNext
、OnError
、OnComplete
(或者在其订阅上调用Dispose
)时可以引入并行性,那么它应该注意正确地序列化这些调用。