FSharp中的多状态代理编程的任何其他示例?

时间:2017-04-28 22:21:47

标签: asynchronous f# agent mailboxprocessor

我正在研究具有多种状态的F#代理,即使用“let rec /和”关键字组合(根据Expert F#3.0的“消息处理和状态机”)来提供多个异步块。到目前为止,我能找到的唯一例子是here(也称为Fssnip.net)的“限制代理人”。有没有其他资源来学习这种模式?

编辑:我的特定应用程序是具有两种状态的代理

| StartFeed rateMultiplier replychannel ->

     - replychannel out data values at a delay (provided with each value) 
       multiplied by rateMultiplier
     - loop by using  
       thisAgent.Post(StartFeed rateMultiplier replychannel)


| Pause -> 

我想提供一些方法来传递一个进给速率乘数值,该值通过“馈送”异步状态中的传入乘数来增加/减少延迟,而不会中断值的馈送。我想这个问题可以归结为“如何在仍然知道新消息的同时保持异步状态块主动循环?”几乎像跳过收件箱一样。接收异步等待,除非实际上有消息进来? Inbox.scan?

编辑2:鉴于MailboxProcessor的消息队列方面,我可以看到代理接收并放入队列的外部消息(具有不同的rateMultiplier值)将成功更改速率而不会中断数据流价值观。关于“暂停”的任何建议仍然会受到赞赏。

1 个答案:

答案 0 :(得分:0)

我找到了Tomas Petricek的条目https://github.com/tpetricek/FSharp.AsyncExtensions/blob/master/src/Agents/BlockingQueueAgent.fs,它为代理提供了标准的邮箱处理器队列,这是一种选择它将用来处理下一个传入消息的异步块的方法(即让代理商改变其状态'):

  • inbox.Receive()用于标准状态' - 代理商的消息'收件箱' queue既不是full也不是空(State#1)
  • inbox.Scan()用于'边缘'或限制空(状态#2)和完整(状态#3)消息'收件箱'队列

  • 代理(在三种状态中的任何一种状态下)响应收到的消息所采取的操作被写为**不同的异步块,这些块被赋予其拥有 && 39;和& #39;代理中的异步阻止'让rec'环;我曾经想过,让我们回忆......和...'异步块被限制为具有消息接收功能(.Receive,.Scan等),这是不正确的,它们可能是任何保持所需控制流的异步块,如“让”的下一个特性所示。 REC ......然后......'代理人身体:

  • 一旦代理人(在3个州中的任何一个状态中,通过路由到相应的操作来响应新消息),该动作本身就会通过呼叫另一个'和'来完成。代理主体的异步块'让rec' loop,a' chooseState()',一个if / then块,用于确定哪个州将处理新邮件并调用'和' 3个可用的异步块。

此示例似乎必要,用于演示多国家代理正文构建的惯用,具体说明如何结合消息接收,响应和循环控制这三个功能作为一个单一的递归元素,让...和......以及..."构造

当然存在其他消息传递框架,但这是一个更复杂的代理的通用逻辑/路由设计,无论框架如何,因此: 谢谢,托马斯。