我正在学习有关F#代理(MailboxProcessor
)工作的MailboxProcessor。与一个LIFO逻辑
我处理的相当非常规的问题。
- 我有一个代理(
dataSource
),它是流数据的来源。数据必须由一系列代理处理(dataProcessor
)。我们可以将dataProcessor
视为某种跟踪设备。 - 数据可以在除了与该
dataProcessor
可以是能够处理其输入端的转速更快流动。 - 它是确定有一定的延迟。但是,我必须确保代理处于其工作之上,并且不会在过时的观察结果下堆积起来
我正在探索解决此问题的方法。
第一个想法是在dataSource
中实施stack(LIFO)。当dataProcessor
变得可用于接收和处理数据时,dataSource
将发送最新可用观察值。此解决方案可能会工作,但可能会变得复杂,因为dataProcessor
可能需要被阻止并重新激活;并将其状态通知给dataSource
,导致双向通信问题。这个问题可以归结为在consumer-producer problem一个blocking queue
,但我不知道..
的第二个想法是有dataProcessor
电话留言的照顾排序。在这个架构中,dataSource
只会在dataProcessor
的队列中发布更新。 dataProcessor
将使用Scan
来获取队列中可用的最新数据。这可能是要走的路。但是,我不确定在MailboxProcessor
的当前设计中是否可以清除消息队列,删除较旧的旧消息队列。此外,here,写的是:
不幸的是,在F#的当前版本TryScan功能 破两种方式。首先,整点是指定一个超时时间 ,但实现并没有真正遵守它。具体来说, 不相关的消息重置计时器。其次,作为与其它扫描 功能,消息队列,以防止任何 其他线程可以发布对于扫描的持续时间,其可以是 任意长的时间的锁下检查。因此,TryScan函数本身 倾向于锁定并发系统,甚至可能引入死锁 ,因为调用者的代码是在锁内部进行评估的(例如,从函数参数中发布 到Scan或TryScan可以使代理程序 死锁等待获取锁的锁块已经在 之下)。
拥有最新的观测反弹可能是一个问题。 这篇文章的作者,@Jon Harrop建议,
我设法围绕它建筑,所产生的架构实际上更好。实质上,我急切地使用我自己的本地队列
Receive
所有消息和过滤器。
这个想法肯定值得探索,但是在开始使用代码之前,我会欢迎一些关于如何构建我的解决方案的意见。
谢谢。
FWIW,我只测试了F#3.1.1'TryScan'超时错误,它已得到修复。 –