Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous FSharp中还有其他多状态代理编程的例子吗?_Asynchronous_F#_Agent_Mailboxprocessor - Fatal编程技术网

Asynchronous FSharp中还有其他多状态代理编程的例子吗?

Asynchronous FSharp中还有其他多状态代理编程的例子吗?,asynchronous,f#,agent,mailboxprocessor,Asynchronous,F#,Agent,Mailboxprocessor,我正在研究具有多个状态的F#代理,即使用“let rec/and”关键字组合(根据专家F#3.0的“消息处理和状态机”)来提供多个异步块。到目前为止,我能找到的唯一一个例子是讨论过的“节流代理”(也是Fssnip.net)。是否有其他资源可用于学习此模式 编辑:我的特定应用程序是一个具有两种状态的代理 | StartFeed rateMultiplier replychannel -> - replychannel out data values at a delay (pro

我正在研究具有多个状态的F#代理,即使用“let rec/and”关键字组合(根据专家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 -> 
我想提供一些方法来传入一个提要速率乘数值,该值在“提要”异步状态下增加/减少传入乘数的延迟,而不中断值的提要。我想问题可以归结为“如何使异步状态块在仍然知道新消息的情况下保持活动循环?”几乎就像跳过收件箱一样。接收异步等待,除非消息实际传入?收件箱扫描


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

我找到了Tomas Petricek的条目,它为代理提供了一种方法,使用标准的mailboxprocessor队列,选择它将使用哪个异步块来处理下一个传入消息(即,让代理“更改其状态”):

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

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

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

在演示多状态代理主体结构的用法时,此示例似乎是必不可少的,具体来说,它演示了如何将消息接收、响应和循环控制这三个功能组合为单个“let rec…和…和…”结构的相互递归元素

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

我从你那里得到了一些“暂停”和“让我们记录”的想法