我正在研究具有多种状态的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值)将成功更改速率,而不会中断数据值流。关于“暂停”的任何建议仍将受到赞赏。
我找到了Tomas Petricek的条目https://github.com/tpetricek/FSharp.AsyncExtensions/blob/master/src/Agents/BlockingQueueAgent.fs,它为代理提供了标准的邮箱处理器队列,一种选择它将用于处理下一个传入消息的异步块的方法(即让代理“改变其状态”):
这个例子对于演示多状态代理主体构造的惯用使用似乎是必不可少的,特别是如何将消息接收,响应和循环控制这三个功能组合为单个'let rec ...和...的相互递归元素。和......“建设。
当然还存在其他消息传递框架,但这是一个更复杂的代理的通用逻辑/路由设计,无论框架如何,所以:谢谢,Tomas。