![](/img/trans.png)
[英]Observable (Rx) for a continuous (async) stream of objects in repository
[英]RX terminolgy: Async processing in RX operator when there are frequent observable notifications
目的是在RX运算符中对稀缺资源进行一些异步工作,例如Select。 当可观察到的通知以比异步操作完成所需的时间更快的速率出现时,就会出现问题。
现在,我实际上解决了问题。 我的问题是这种特殊问题的正确术语是什么? 它有名字吗? 是背压吗? 到目前为止,我所做的研究表明这是一个压力问题,但从我的理解来看并不一定是背压。 我发现的最相关的资源是: https : //github.com/ReactiveX/RxJava/wiki/Backpressure-(2.0) http://reactivex.io/documentation/operators/backpressure.html
现在到实际代码。 假设有一种稀缺资源,它是消费者。 在这种情况下,使用资源时会引发异常。 请注意,此代码不应更改。
public class ScarceResource
{
private static bool inUse = false;
public async Task<int> AccessResource()
{
if (inUse) throw new Exception("Resource is alredy in use");
var result = await Task.Run(() =>
{
inUse = true;
Random random = new Random();
Thread.Sleep(random.Next(1, 2) * 1000);
inUse = false;
return random.Next(1, 10);
});
return result;
}
}
public class ResourceConsumer
{
public IObservable<int> DoWork()
{
var resource = new ScarceResource();
return resource.AccessResource().ToObservable();
}
}
现在这是天真的实现要消耗资源的问题。 引发错误是因为通知的发出速度比使用者运行速度要快。
private static void RunIntoIssue()
{
var numbers = Enumerable.Range(1, 10);
var observableSequence = numbers
.ToObservable()
.SelectMany(n =>
{
Console.WriteLine("In observable: {0}", n);
var resourceConsumer = new ResourceConsumer();
return resourceConsumer.DoWork();
});
observableSequence.Subscribe(n => Console.WriteLine("In observer: {0}", n));
}
使用以下代码可以解决问题。 我通过结合使用完整的BehaviorSubject和Zip运算符来减慢处理速度。 从本质上讲,这段代码所做的是采用顺序方法,而不是并行方法。
private static void RunWithZip()
{
var completed = new BehaviorSubject<bool>(true);
var numbers = Enumerable.Range(1, 10);
var observableSequence = numbers
.ToObservable()
.Zip(completed, (n, c) =>
{
Console.WriteLine("In observable: {0}, completed: {1}", n, c);
var resourceConsumer = new ResourceConsumer();
return resourceConsumer.DoWork();
})
.Switch()
.Select(n =>
{
completed.OnNext(true);
return n;
});
observableSequence.Subscribe(n => Console.WriteLine("In observer: {0}", n));
Console.Read();
}
问题这是背压吗?如果不是,是否还有其他术语相关联?
您基本上是在实现一种锁定形式,即互斥体。 您的代码造成了背压,实际上并没有解决它。
想象一下,如果您的源代码不是生成器函数,而是一系列数据推送。 数据推送以每毫秒恒定的速率到达。 处理每一个需要10 Millis,您的代码将强制进行串行处理。 这会导致背压:Zip将无限处理未处理的数据推送,直到耗尽内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.