如何每隔5分钟部署一次IO功能无阻塞(Haskell)?

时间:2017-07-02 11:08:57

标签: haskell

上下文:我有一个名为slowBlockingFunction的简单IO函数,它将数据的有效负载发送到服务器。问题是这个函数很慢并且阻塞,否则我需要在程序的其余部分实时执行。

问题:是否有办法以异步方式每5分钟重复调用slowBlockingFunction(因此它不会通过阻止干扰其他实时执行代码)?我想这会以某种方式将它移动到一个新的线程?

1 个答案:

答案 0 :(得分:3)

这可以通过重复启动一个

的线程来完成
  1. 启动另一个只运行slowBlockingFunction,然后
  2. 的线程
  3. 睡了5分钟并重复。
  4. 像这样:

    import Control.Concurrent
    
    repeatedlyDoSlowStuffInBackground = forkIO doStuff
        where
        doStuff = do
            forkIO slowBlockingFunction
            threadDelay (1000 * 1000 * 60 * 5)
            doStuff
    

    然后你只需在某处拨打repeatedlyDoSlowStuffInBackground

    请注意,这不会补偿可变延迟。例如。线程因系统负载延迟2秒而被延迟,在这种情况下,它会再睡5分钟而不是仅仅睡4分58秒进行补偿