- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 MailboxProcessor 对异步作业处理框架进行建模。我的要求是启动、停止、暂停和恢复作业处理器。我可以使用 MailboxProcessor 构建暂停/恢复功能吗?我也应该能够停止和启动?我正在尝试模仿 Windows 服务。
我有一个 C# 系统,使用队列/线程实现。我正在寻找设计替代方案,那时我看到了 MailboxProcessor。我相信我可以使用它,但无法弄清楚如何处理上述情况。那么有没有可能实现这个功能呢?
最佳答案
当然:) 只需持有一个内部作业队列,并在作业处理器处于启动模式时枚举队列。在任何其他模式下,只需将新作业排入队列,直到处理器进入启动模式。
type 'a msg = // '
| Start
| Stop
| Pause
| Job of (unit -> unit)
type processQueue() =
let mb = MailboxProcessor.Start(fun inbox ->
let rec loop state (jobs : System.Collections.Generic.Queue<_>) =
async {
if state = Start then
while jobs.Count > 0 do
let f = jobs.Dequeue()
f()
let! msg = inbox.Receive()
match msg with
| Start -> return! loop Start jobs
| Pause -> return! loop Pause jobs
| Job(f) -> jobs.Enqueue(f); return! loop state jobs
| Stop -> return ()
}
loop Start (new System.Collections.Generic.Queue<_>()))
member this.Resume() = mb.Post(Start)
member this.Stop() = mb.Post(Stop)
member this.Pause() = mb.Post(Pause)
member this.QueueJob(f) = mb.Post(Job f)
关于f# - 如何使用 MailboxProcessor 创建作业队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1041195/
如果状态被视为函数的坏主意,为什么在使用 MailboxProcessor 时将状态视为好的? 为了扩展,我正在向某人解释函数式编程,函数如何不使用状态(函数外部没有变量 - 即相同数据输出相同数据)
我一直在尝试设计一个允许大量并发用户同时在内存中表示的系统。在着手设计这个系统时,我立即想到了某种基于 Actor 的解决方案,类似于 Erlang。 该系统必须在 .NET 中完成,因此我开始使用
我一直在慢慢研究 F# 带来的所有功能。 MailboxProcessor 尤其引起了我的兴趣。 C# 中的等效项很可能会使用锁。我们能否将 MailboxProcessor 视为锁的替代品? 在下面
我刚刚在 F# 中发现了 MailboxProcessor,它被用作“状态机”……但我找不到太多关于它们的推荐用法。 例如......假设我正在制作一个有 100 个屏幕上敌人的简单游戏,我应该使用
我编码了“经典”bank account kata使用 F# MailboxProcessor 是线程安全的。但是当我尝试将交易并行添加到帐户时,速度非常慢非常快:10 个并行调用有响应(2 毫秒),
我是 F# 的新手,并尝试使用 MailboxProcessor 来确保状态更改是单独完成的。 简而言之,我将操作(描述状态更改的不可变对象(immutable对象))发布到 MailboxProce
我正在尝试使用 MailboxProcessor 对异步作业处理框架进行建模。我的要求是启动、停止、暂停和恢复作业处理器。我可以使用 MailboxProcessor 构建暂停/恢复功能吗?我也应该能
我认为这个问题涉及同一领域,但我看不出它如何适用于我的情况。 Generic reply from agent/mailboxprocessor? 这是背景。我有一些状态,现在只能说它只包含一个玩家列
我使用 http://fssnip.net/3K 中的代码创建了一个控制台程序.我发现 我想在末尾添加“System.Console.ReadLine() |> ignore”以等待线程完成。是否可以
看着: member this.PostAndReply : (AsyncReplyChannel -> 'Msg) * ?int -> 'Reply 我不明白为什么签名对我来说看起来如此违反直觉。我
我正在尝试编写一个非常简单的异步测试框架之类的东西。但我认为我遇到了某种限制或错误。抱歉,我无法在较小的代码库上重现此内容。 这是我想出的基本框架: module TestRunner ope
我不明白为什么以下代码卡在对 GetTotal 的调用中.我似乎无法在 MailboxProcessor 内部进行调试,因此很难看出发生了什么。 module Aggregator open Syst
我有一个命令定期运行 SFTP 检查并将结果记录到文件中。 let logPath = Path.Combine(config.["SharedFolder"],timestamp) let sw =
我想处理消息的类型 Add x 让程序记住数字 x Print 让它打印所有记住的数字 我为什么要这样写: open System type Message = | Add of int
我正在学习 F# 代理 (MailboxProcessor)。 我正在处理一个相当不寻常的问题。 我有一个代理 (dataSource),它是流数据源。数据必须由一组代理 (dataProcessor
当其 MailboxProcessor 被处理(或以其他方式停止)时,是否可以让 PostAndAsyncReply 立即返回?或者是否有一些关于如何安全地使用 PostAndReply 方法而不造成
我想按顺序处理一系列作业,但我想将这些作业并行排队。 这是我的代码: open System.Threading.Tasks let performWork (work : int) = task
我对下面的代码示例和人们的想法有点好奇。 这个想法是从 NetworkStream (~20 msg/s) 中读取数据,而不是在 main 中工作,而是将内容传递给 MainboxProcessor
基本上,我想将以下内容更改为有限的线程解决方案,因为在我的情况下,计算列表太大,产生了太多线程,我想用更少的线程进行实验和测量性能。 // the trivial approach (and larg
我坚持为使用 MailboxProcessor 的 F# 项目修复我的 TFS 测试运行。问题是我从 TFS 测试运行器收到的以下警告: System.AppDomainUnloadedExcepti
我是一名优秀的程序员,十分优秀!