IObserver在 ReactiveX 范式中,處理執行緒安全是否是消費者 () 的責任?
例如,如果OnCompleted呼叫出現時OnNext仍在另一個執行緒上執行?
它看起來像來自 Rx .NET 源,但檔案有些模糊。
uj5u.com熱心網友回復:
自從我最初在推文中提出這個問題以來,我相信我現在已經找到了一個權威的答案。
看來我的假設是錯誤的,即執行緒安全的序列化是消費者的責任(IObserver)。
根據原始的Rx 設計指南檔案(似乎是一個保守得最好的秘密 :)
4.2. 假設觀察者實體以序列化方式呼叫
由于 Rx 使用推送模型并且 .NET 支持多執行緒,不同的訊息可能同時到達不同的執行背景關系。如果可觀察序列的消費者必須在每個地方處理這個問題,他們的代碼將需要執行大量的內務處理以避免常見的并發問題。以這種方式撰寫的代碼將更難維護,并且可能會遇到性能問題。
更遠:
6.7. 在可觀察序列實作中序列化對方法的呼叫
IObserverRx 是一個可組合的 API,許多運算子可以一起使用。如果所有操作員都必須處理并發,那么單個操作員將變得非常復雜。除此之外,最好在它第一次出現的地方控制并發。最后,如果每次使用 Rx 都必須處理并發性,那么使用 Rx API 將變得更加困難。
最后:
6.8. 避免序列化運算子 由于所有 Rx 運算子都必須遵守準則 6.7,因此運算子可以安全地假設他們的輸入是序列化的。添加過多的同步會使代碼混亂,并可能導致性能下降。如果可觀察序列不遵循 Rx 合約(參見第 0 章),則由開發人員撰寫最終用戶應用程式來修復可觀察序列,方法是
Synchronize在開發人員獲得可觀察序列的第一個位置呼叫運算子. 這樣,附加同步的范圍就被限制在需要的地方。
我個人對此的看法:如果原始序列生成IObservable可以在呼叫OnNext,OnError時OnComplete(或Dispose在其訂閱中呼叫時)引入并行性,則應注意正確序列化這些呼叫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/485012.html
下一篇:執行器服務回傳不正確的回應
