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

问题描述 投票:3回答:1

我正在研究具有多种状态的F#代理,即使用“let rec / and”关键字组合(根据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值)将成功更改速率,而不会中断数据值流。关于“暂停”的任何建议仍将受到赞赏。

asynchronous f# agent mailboxprocessor
1个回答
0
投票

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

  • inbox.Receive()用于'标准状态' - 代理的消息'收件箱'队列既不是满的也不是空的(状态#1)
  • inbox.Scan()用于'edge'或限制空(State#2)和full(State#3)消息'inbox'队列的情况
  • 代理(在三种状态中的任何一种状态)响应接收到的消息可以采取的动作被写为**不同的异步块,在代理的'let rec'循环中给出它们自己的'和'异步块;我曾经想过'让rec ...和......'异步块被限制为具有消息接收功能(.Receive,.Scan等),这是不正确的,它们可能是任何保持所需控制的异步块流程,如'let rec ... and ...'代理主体的下一个特性所示:
  • 一旦代理在3个状态中的任何一个状态中通过路由到适当的动作来响应新消息,该动作本身就完成了对代理主体的另一个'和'异步块的调用'let rec'循环,a' chooseState()',一个if / then块,用于确定哪个状态将处理新消息,并从3个可用中调用'和'异步块。

这个例子对于演示多状态代理主体构造的惯用使用似乎是必不可少的,特别是如何将消息接收,响应和循环控制这三个功能组合为单个'let rec ...和...的相互递归元素。和......“建设。

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

© www.soinside.com 2019 - 2024. All rights reserved.