F# 如何使用MailboxProcessor创建作业队列?
我正在尝试使用MailboxProcessor建模一个异步作业处理框架。我的要求是启动、停止、暂停和恢复作业处理器。我可以用MailboxProcessor构建暂停/恢复功能吗?我也应该能够停止和启动?我正在尝试模仿Windows服务 我有一个C#系统,使用队列/线程实现。我在寻找设计替代方案,那是我看到MailboxProcessor的时候。我相信我可以使用它,但我不知道如何处理上述情况。那么有可能实现此功能吗?当然:)只需保留一个内部作业队列,并在作业处理器处于启动模式时枚举队列即可。在任何其他模式下,只需将新作业排队,直到处理器进入启动模式F# 如何使用MailboxProcessor创建作业队列?,f#,F#,我正在尝试使用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)
键入'a msg=/'
|开始
|停止
|停顿
|作业(单位->单位)
键入processQueue()=
让mb=MailboxProcessor.Start(有趣的收件箱->
let rec循环状态(作业:System.Collections.Generic.Queue)=
异步的{
如果状态=开始,则
而jobs.Count>0则可以
设f=jobs.Dequeue()
f()
let!msg=inbox.Receive()
配味精
|开始->返回!循环开始作业
|暂停->返回!循环暂停作业
|作业(f)->jobs.Enqueue(f);返回!循环状态作业
|停止->返回()
}
循环启动(新的System.Collections.Generic.Queue())
成员this.Resume()=mb.Post(开始)
成员this.Stop()=mb.Post(Stop)
成员this.Pause()=mb.Post(暂停)
成员this.QueueJob(f)=mb.Post(作业f)
此类的行为与预期的一样:可以在暂停状态下将作业排队,但它们只能在开始状态下运行。一旦processQueue停止,它就无法重新启动,并且所有排队的作业都不会运行(很容易改变这种行为,这样,它就不会在停止状态下将作业排队,而不是终止队列)
如果您需要邮箱处理器和代码之间的双向通信,请使用。您可能希望签出,因为我认为它已经签出。+1轻微改进:您可以通过明确状态使代码更清晰。然后,您还可以将所有状态封装在
状态
类型中,特别是,只有暂停
状态才会有队列。此外,您可能希望将状态表示为相互递归的异步工作流……作业队列上的此块在完成之前不会被阻塞吗?这似乎会使暂停
无效。