asynchronous - FSharp 中多状态代理编程的其他示例吗?

标签 asynchronous f# agent mailboxprocessor

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

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

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

最佳答案

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

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

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

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

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

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

关于asynchronous - FSharp 中多状态代理编程的其他示例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43689651/

相关文章:

java - 对象化 GAE/J Google App Engine : Understanding asynchronous load

c# - 从异步 lambda Action 转换为 Func<Task>?

f# - 在 F# 中将字节转换为枚举的实例

f# - 打破迭代并获得值和状态?

sql-server - SQL Server 代理在 SQL Server 2014 Express 中不工作

linux - 如何在 TFS 服务器的 linux 代理中运行 shell 脚本

javascript - 在 JS 中使用 RequireJS/AMD 可以获得多少速度?

multithreading - F# 异步任务取消,无需 token

jboss7.x - JBoss EAP 6/JBoss AS 7 的 OpenAM/OpenSSO 代理

c# - 使用await时读取文本文件和代码跳转