gpt4 book ai didi

c# - 当数据流的速度快于订阅者可以消耗的速度时,Rx 会如何表现?

转载 作者:可可西里 更新时间:2023-11-01 09:03:05 24 4
gpt4 key购买 nike

我对在生产应用程序中使用 Rx 感到非常兴奋;我将在其中收听来自不同 channel 的传入通知更新。

我将在此流之上编写 Rx 查询,我将在其中使用 .Window() 运算符进行节流。订阅者(在我的例子中是 ActionBlock)将以阻塞方式处理这些数据; (即它不会从 ActionBlock 生成任务)。请记住,如果数据的速度比我的订阅者可以消耗的速度快得多,那么传入数据会发生什么。 Rx 查询是否在内部使用任何缓冲区;它会溢出吗?

最佳答案

您所指的现象称为背压,Rx 团队目前正在探索处理这种情况的不同方法。一种解决方案可能是将背压反馈给 Observable,这样它可能会“慢下来”。

要减轻背压,您可以使用有损运算符,例如 Throttle 或 Sample。

Timothy 的回答大部分是正确的,但是 有可能在单个线程上发生背压。如果您使用异步代码,就会发生这种情况。从这个意义上说,背压与同步和调度相关,而不是线程(回想一下,默认情况下 Rx 是单线程的)。

如果您遇到事件生成速度快于消耗速度的情况,并且您没有使用有损运算符来减轻背压,这些项目通常会被安排/排队/缓冲,这可以导致大量内存分配。

就我个人而言,这对我来说不是问题,因为通常事件的处理速度比产生的速度快,或者丢失事件根本不是一种选择,因此额外的内存消耗是不可避免的。

关于c# - 当数据流的速度快于订阅者可以消耗的速度时,Rx 会如何表现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20661811/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com