使用 LIFO 逻辑运行的 MailboxProcessor

2024-01-18

我正在学习 F# 代理(MailboxProcessor).

我正在处理一个相当非传统的问题。

  • 我有一名代理人(dataSource)这是流数据的来源。数据必须由一系列代理进行处理(dataProcessor)。我们可以考虑dataProcessor作为某种跟踪设备。
  • 数据流入的速度可能比数据传输的速度快dataProcessor也许能够处理其输入。
  • 有一些延迟是可以的。但是,我必须确保代理始终保持其工作状态,并且不会堆积在过时的观察结果中

我正在探索解决这个问题的方法。

The 第一个想法是要实施一个stack http://en.wikipedia.org/wiki/Stack_%28abstract_data_type%29(后进先出)在dataSource. dataSource将发送最新的观察结果dataProcessor可以接收和处理数据。这个解决方案可能有效,但可能会变得复杂dataProcessor可能需要被阻止并重新激活;并将其状态传达给dataSource,导致双向通信问题。这个问题可能归结为blocking queue in the 消费者-生产者问题 http://msdn.microsoft.com/en-us/library/vstudio/hh297096%28v=vs.100%29.aspx但我不确定..

The 第二个想法就是拥有dataProcessor负责消息排序。在这个架构中,dataSource将简单地发布更新dataProcessor的队列。dataProcessor将使用Scan获取队列中可用的最新数据。这可能是要走的路。但是,我不确定在当前的设计中是否MailboxProcessor可以清除消息队列,删除较旧的过时消息。此外,here https://stackoverflow.com/questions/4880171/how-to-use-tryscan-in-f-properly,记载为:

不幸的是,当前版本的 F# 中的 TryScan 函数是 以两种方式破碎。首先,重点是指定超时 但实施实际上并没有遵守它。具体来说, 不相关的消息会重置计时器。其次,与其他扫描一样 函数中,消息队列在锁下进行检查,以防止任何 在扫描期间禁止其他线程发帖,这可以是 任意长的时间。因此,TryScan 函数本身 往往会锁定并发系统,甚至可能导致死锁 因为调用者的代码是在锁内评估的(例如发布 从函数参数到 Scan 或 TryScan 可能会使代理陷入僵局 当锁下的代码阻塞等待获取锁时 已经在下)。

最新的观察结果反弹可能是一个问题。 这篇文章的作者 @Jon Harrop 建议

我设法围绕它进行架构设计,最终的架构实际上更好。本质上,我渴望Receive所有消息和过滤器都使用我自己的本地队列。

这个想法确实值得探索,但是在开始使用代码之前,我欢迎一些关于如何构建我的解决方案的意见。

谢谢。


听起来您可能需要邮箱处理器的破坏性扫描版本,我在您可能感兴趣的博客系列中使用 TPL Dataflow 实现了此功能。

我的博客目前已关闭以进行维护,但我可以向您指出 Markdown 格式的帖子。

Part1 https://github.com/MoiraeSoftware/moiraesoftware.github.com/blob/source/source/_posts/2012-01-22-FSharp-Dataflow-agents-I.markdown
Part2 https://github.com/MoiraeSoftware/moiraesoftware.github.com/blob/source/source/_posts/2012-01-24-FSharp-Dataflow-agents-II.markdown
Part3 https://github.com/MoiraeSoftware/moiraesoftware.github.com/blob/source/source/_posts/2012-02-19-fsharp-dataflow-agents-iii.markdown

您还可以查看以下代码github https://github.com/7sharp9/FSharpDataflow

我还写了关于我潜伏的恐惧中的扫描问题post https://github.com/MoiraeSoftware/moiraesoftware.github.com/blob/source/source/_posts/2012-07-15-the-lurking-horror.markdown

希望有帮助...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 LIFO 逻辑运行的 MailboxProcessor 的相关文章

随机推荐

  • simplecursoradapter textview 给出 nullpointerException

    我有两个 xml 文件 一个是列表视图 另一个是列表视图和一些 texview 的布局 我想更改第二个 xml 文件中文本视图的颜色 这就是我到目前为止所做的 main1 xml
  • Laravel Eloquent `take` 和 `orderBy`

    当我尝试使用每个 take 和 orderBy 查询时 模型返回一些记录 this gt hasMany App User gt take 3 this gt hasMany App User gt orderBy id desc 但是当我
  • 如何在CSS中制作具有透明度的径向渐变

    我想在透明度变化的地方制作一个径向渐变 我可以让它线性工作 但不是径向工作 background webkit gradient linear left top left bottom from rgba 50 50 50 0 8 to r
  • 具有高多边形网格的 OpenGL 3D 光线拾取

    如何在包含高多边形网格的模型的 3D 场景中实现 3D 光线拾取 迭代所有三角形来执行三角形线相交测试需要花费太多时间 我知道存在八叉树等方法 并且应该可以将这些方法用于场景中的模型 但我不知道应该如何在网格级别使用这些概念 但是 如果您在
  • GWT - 如何编译移动排列

    我知道如何使用延迟绑定为不同的用户代理编译 GWT 应用程序 但这似乎没有提供区分桌面 移动浏览器的方法 除了制作基于 gwt mobile webkit 的新应用程序之外 如何将现有的 GWT 应用程序转换为具有重新设计的移动界面 如果您
  • 如何使maven-compiler-plugin不隐藏错误源位置

    也许有一个maven compiler plugin这个选项 但我还没有找到 When javac直接运行并打印错误 在消息的第一行之后 它显示受影响的源行下一行上有一个插入符号指向错误位置 它看起来像这样 com invariantpro
  • 确保泛型类型在 Typescript 中仅具有原始属性

    我有一个采用泛型类型的函数 我需要确保该类型是 JSON 可序列化的 也称为仅原始属性 我的尝试是为 JSON 兼容类型定义一个接口 并强制我的泛型扩展此类型 type JSONPrimitive string number boolean
  • 如何通过按键终止 while 循环?

    我正在读取串行数据并使用 while 循环写入 csv 文件 我希望用户一旦觉得已经收集了足够的数据就能够终止 while 循环 while True do a bunch of serial stuff if the user press
  • swift 中 DispatchQueue 类型之间的区别

    据我了解 Swift 中有 3 种类型的 DispatchQueue 主要 连续剧 主线 全球 并发 后台线程并行工作 自定义 并发或串行 每一个都可能有效 异步或同步 第一个问题 主队列是否在工作仅 UI 线程并且不在另一个线程上工作 如
  • 为什么反应路由器在 vercel 上不起作用?

    我正在尝试将无服务器网络发布到 vercel 我想使用react router 这在我的计算机上运行良好 但是当我部署它时它不起作用 有人可以帮助我吗 我想在没有服务器的情况下完成 My main code import React fro
  • ServiceLocator 是一种反模式吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 最近我读过马克 西曼的文章 http blog ploeh dk 2010 02 03 ServiceLocatorisanAnti Patte
  • 如何在 Android 上设置 ImageView 的背景颜色?

    我尝试了一些方法 但没有任何效果 我试图更改 Android 上 ImageView 上的背景颜色 但没有任何反应 这是我的 xml
  • CSS3“提升角”不透明度阴影

    我一直在玩一些 CSS3 阴影效果 我非常喜欢 升角 效果 但在尝试向元素添加不透明度时遇到了问题 我的问题是 有没有办法在不透明的元素上创建 升角 效果 http jsfiddle net WAvZu http jsfiddle net
  • 为什么我的 Android 应用程序在类开头使用 findViewById(R.id.******) 初始化变量时会崩溃并出现 NullPointerException?

    此代码 带有注释的顶部块 成功运行 public class MainActivity extends AppCompatActivity EditText username EditText findViewById R id editT
  • 多列索引还需要单列索引吗?

    我陷入了一个设计不佳的系统中 现在我正在他们的数据库上做DBA 我有很多像下面这样的情况 伪代码 Table t1 c1 c2 c3 c4 key c1 key c2 key c1 c2 key c1 c2 c3 单列索引真的有必要吗 因为
  • 如何获取 Objective C(Foundation 框架)中命令行工具的可执行路径?

    我正在尝试找出一种方法来识别 Objective C 中命令行工具的可执行路径 因此 如果可执行文件是 Applications Utils MyTool 则该方法将返回 Applications Utils 我正在使用基础框架 称我为纯粹
  • Codeigniter 会话安全

    如何提高会话的安全性 this gt session gt userdata userid 我一直在为我的 ajax 调用而抛弃这个小坏男孩 有些情况我没有 然后我就想 使用 DOM 中的 id 真的安全吗 如果 DOM 被更改以破解用户帐
  • 恢复 Tensorflow 中新模型子集的变量?

    我正在做一个通过 Tensorflow 增强 4 层 DNN 到 5 层 DNN 的示例 我在 TF 中使用保存会话和恢复来制作它 因为 TF 教程中有一个简短的段落 例如 你可能已经训练了一个 4 层的神经网络 现在想要训练一个 5 层的
  • 具有相同函数名的包

    R 中具有相同函数名称的库似乎很烦人 解决以下问题的最简单方法是什么 Attaching package dplyr The following objects are masked from package stats filter la
  • 使用 LIFO 逻辑运行的 MailboxProcessor

    我正在学习 F 代理 MailboxProcessor 我正在处理一个相当非传统的问题 我有一名代理人 dataSource 这是流数据的来源 数据必须由一系列代理进行处理 dataProcessor 我们可以考虑dataProcessor