问题标签 [mailboxprocessor]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
f# - MailboxProcessor 数据序列化?
与 NServiceBus、MSMQ 等基于消息的体系结构相比……有没有办法“恢复备份”F# 邮箱处理器的状态?
还是扩展 MailboxProcessor 以启用数据序列化的最佳实践?
例如,在某种硬件故障的情况下。
f# - F#奇怪的代理重新初始化行为
我有一个封装在一个类中的 F# 3.0 代理:
当我按如下方式向它发送消息时:
我得到了预期的回应:
但是,如果我删除代理的 let 绑定并将其直接分配给 this.agent 属性:
然后我得到回应:
我已经盯着这个看了好几个小时,我不明白为什么每次我调用 AgentWrapper.Send 时代理都会重新初始化。感觉 this.agent 每次我调用它时都会被重新分配(即表现得像一个方法,而不是一个属性)。我错过了什么?
asynchronous - MailboxProcessor.Dispose 不会使对象 GC 可收集
我坚持为使用 MailboxProcessor 的 F# 项目修复我的 TFS 测试运行。问题是我从 TFS 测试运行器收到的以下警告:
System.AppDomainUnloadedException:试图访问已卸载的 AppDomain。如果测试启动了一个线程但没有停止它,就会发生这种情况。确保测试启动的所有线程在完成之前都已停止。
我猜这个问题是由 MailboxProcessor 引起的。以下片段演示了该问题(我从 fsi 运行它):
我希望输出行说 weakTarget is dead。但它还活着。我认为这表明存在一些内存泄漏。问题是我做错了什么?第二个问题是GC问题是否与TFS test runner问题有关。
f# - PostAndReply 在已处理的 MailboxProcessor 上
是否可以在其 MailboxProcessor 被释放(或以其他方式停止)时立即返回 PostAndAsyncReply?或者是否有一些关于如何安全使用 PostAndReply 方法而不产生死锁的“模式”/最佳实践?
现在我遇到的问题是 PostAndAsyncReply 在处理 MailboxProcessor 后永远不会返回。使用 timeout 参数不是一个选项,因为我不能等待(除了选择合理的超时是非常困难或不可能的,因为它取决于太多的因素)。
编辑:我见过的大多数 MailboxProcessors 示例(包括 MSDN 上的示例)甚至不介意处置 MailboxProcessors。并且 MSDN 没有解释 MailboxProcessors 在被处理时如何反应。有没有必要丢弃它们?
f# - 创建一个只有一些消息得到响应的代理?
是否可以创建一个仅有时发布回复的邮箱代理?从外观上看,在我看来,如果您想发布回复,您必须始终发送异步回复频道。
对于我的用例,我真的希望能够灵活地使某些消息只需要传递给代理,而其他消息我希望得到同步或异步回复。
.net - 非统一实例化的用法是什么意思?
我无法编译以下代码:
行中有错误member this.CrossoverA(genomeIn: Genome<'T>)
:
错误 1 在此程序点之前的非统一实例化中使用了通用成员“CrossoverA”。考虑重新排序成员,以便首先出现此成员。或者,显式指定成员的完整类型,包括参数类型、返回类型和任何其他泛型参数和约束。
错误 2 此绑定的一个或多个显式类或函数类型变量无法泛化,因为它们被限制为其他类型
并且也符合要求mailbox.Post(CrossoverMessage genomeIn)
:
错误 3 类型 ''T' 与类型 ''a' 不匹配
我没有在项目的任何地方使用变量“a”。此外,名称 CrossoverA 仅在此文件中使用。我感到困惑,项目中的其他类是用类似的打字模式创建的,而且效果很好。
asynchronous - 如何在异步工作流程中使用 Async.Parallel?
我一直在尝试学习如何使用基于异步消息的方法。以下是我尝试做的简化版本。我正在尝试MailboxProcessor
在对象内使用有限状态机。总的来说,与使用基于事件的方法相比,逻辑似乎要简单得多。但是当我尝试使用Async.Parallel
. 在语句后面的代码中,对&printfn "Eval %i" v
进行了两次评估,而不是每次只评估一次。这让我相信我没有正确使用. 是否应该在异步工作流中使用替代方法?i1
i2
Async.Parallel
asynchronous - 使用 LIFO 逻辑操作的 MailboxProcessor
我正在学习 F# 代理 ( MailboxProcessor
)。
我正在处理一个非常规的问题。
- 我有一个代理 (
dataSource
),它是流数据的来源。数据必须由一组代理 (dataProcessor
) 处理。我们可以将dataProcessor
其视为某种跟踪设备。 - 数据流入的速度
dataProcessor
可能比处理其输入的速度要快。 - 有一些延迟是可以的。但是,我必须确保代理始终专注于其工作,并且不会因过时的观察结果而堆积如山
我正在探索解决这个问题的方法。
第一个想法是在. 当可用于接收和处理数据时,将发送可用的最新观察结果。此解决方案可能有效,但可能会变得复杂,因为可能需要阻止并重新激活;并将其状态传达给,从而导致双向通信问题。这个问题可能归结为消费者-生产者问题,但我不确定..dataSource
dataSource
dataProcessor
dataProcessor
dataSource
blocking queue
第二个想法是 dataProcessor
处理消息排序。在这种架构中,将简单地在's 队列dataSource
中发布更新。将用于获取其队列中可用的最新数据。这可能是要走的路。但是,我不确定在当前设计中是否可以清除消息队列,删除旧的过时消息。此外,这里写道:dataProcessor
dataProcessor
Scan
MailboxProcessor
不幸的是,当前版本的 F# 中的 TryScan 函数在两个方面被破坏了。首先,重点是指定超时,但实现实际上并没有兑现它。具体来说,不相关的消息会重置计时器。其次,与其他 Scan 函数一样,消息队列在锁定下进行检查,该锁定防止任何其他线程在扫描期间发布消息,这可以是任意长的时间。因此,TryScan 函数本身往往会锁定并发系统,甚至会引入死锁,因为调用者的代码是在锁内评估的(例如,当锁下的代码阻塞等待时,从函数参数发布到 Scan 或 TryScan 可能会使代理死锁获取它已经处于的锁)。
让最新的观察结果反弹可能是个问题。这篇文章的作者@Jon Harrop 建议
我设法围绕它进行架构设计,最终的架构实际上更好。本质上,我急切地
Receive
使用我自己的本地队列来过滤所有消息和过滤器。
这个想法当然值得探索,但在开始使用代码之前,我会欢迎一些关于如何构建我的解决方案的意见。
谢谢你。
multithreading - MailboxProcessor 和与 GUI Thread 的交互
我通过 SynchronizationContext 创建了一个与 GUI 交互的代理:
那有什么危险吗?如果我有 20 个代理怎么办?这些引发的事件是否同步?假设我对此事件有一些长时间的计算功能。我可以确定其他代理的事件处理程序将等待其终止吗?
asynchronous - 为什么在异步计算表达式中使用“使用”绑定时资源的处理会被延迟?
我有一个代理,我设置它在后台做一些数据库工作。实现看起来像这样:
有了这个,我发现如果在一段时间内多次调用它,我会开始让 SqlConnection 对象堆积起来而不是被释放,最终我会用完连接池中的连接(我没有关于有多少“几个”,但连续两次运行集成测试套件总是会导致连接池干涸)。
如果我将其更改use
为 a ,using
那么事情就会得到妥善处理并且我没有问题:
似乎Using
AsyncBuilder 的方法由于某种原因没有正确调用它的 finally 函数,但目前尚不清楚为什么。这是否与我编写递归异步表达式的方式有关,或者这是一些晦涩的错误?这是否表明use
在其他计算表达式中使用可以产生相同的行为?