到目前为止,在Haskell中已经完成了哪些工作来安排以原生方式执行的作业?这是我的想法的草图。
假设我有一个函数work
我想在Date
执行,大概在未来(如果没有,我们可以安排它立即执行)。在这种情况下,让我们假设有某种作业
monad让它发生。
type JobId = ..
schedule :: Date -> Job () -> Job JobId
然后,这被传递到(最好是持久的)调度机制,该机制将在适当的时间执行调度的作业,并且还提供某种类型的参考< code>JobId,以便可以检查或重新调度该作业。我在Ruby中使用过几个不同的作业调度库,比如Delayed Job和Sidekiq。Haskell社区中有类似的关于作业调度问题的工作吗?也许Haskell语言的本质产生了一种足够简单的模式,给定一些原始函数,库就不完全必要了?
为什么不forkIO
和threadDelay
?
下面是您可以做的事情的草图:
type JobId = ThreadId
type Job = IO
schedule :: Date -> Job () -> Job JobId
schedule date job =
forkIO $ do
time <- getCurrentTime
threadDelay (delay time)
job
where
delay time = error "TODO: compute the delay from `time` and `date`"