3

我正在研究具有多种状态的 F# 代理,即使用“let rec/and”关键字组合(根据 Expert F# 3.0 的“消息处理和状态机”)来提供多个异步块。到目前为止,我能找到的唯一示例是此处讨论的“节流代理” (也是 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 -> 

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

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

4

1 回答 1

0

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

  • inbox.Receive() 用于“标准状态” - 代理的消息“收件箱”队列既不满也不空(状态 #1)
  • inbox.Scan() 用于“边缘”或空(状态#2)和满(状态#3)消息“收件箱”队列的限制情况

  • 代理(在三种状态中的任何一种)响应接收到的消息可以采取的动作被写成**不同的异步块,这些块在代理的“let rec”循环中被赋予自己的“和”异步块我曾认为“让rec ...和...”异步块仅限于具有消息接收功能(.Receive,.Scan等),这是不正确的,它们可能是保持所需控制的任何异步块流程,如 'let rec...and...' 代理主体的下一个功能所示:

  • 一旦处于 3 种状态中的任何一种状态的代理通过路由到适当的操作来响应新消息,该操作本身就会通过调用代理主体的另一个“和”异步块“let rec”循环来完成,a ' chooseState()',一个 if/then 块,用于确定哪个状态将处理新消息,并从 3 个可用块中调用该“和”异步块。

这个例子似乎对于演示多状态代理主体结构的惯用用法很重要,特别是如何将消息接收、响应和循环控制这三个功能组合为单个“let rec...and...”的相互递归元素。和......”建设。

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

于 2018-03-03T18:45:15.480 回答