gpt4 book ai didi

f# - 如何使用 MailboxProcessor 创建作业队列?

转载 作者:行者123 更新时间:2023-12-04 22:26:11 32 4
gpt4 key购买 nike

我正在尝试使用 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)

该类的行为符合预期:您可以将作业排入暂停状态,但它们只会在开始状态下运行。一旦 processQueue 停止,它就无法重新启动,并且任何入队的作业都不会运行(很容易改变这种行为,这样,与其杀死队列,它只是不会将处于停止状态的作业入队)。

如果您需要邮箱处理器和代码之间的双向通信,请使用 MailboxProcessor.PostAndReply

关于f# - 如何使用 MailboxProcessor 创建作业队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1041195/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com