上下文:我有一个名为slowBlockingFunction
的简单IO函数,它将数据的有效负载发送到服务器。问题是这个函数很慢并且阻塞,否则我需要在程序的其余部分实时执行。
问题:是否有办法以异步方式每5分钟重复调用slowBlockingFunction
(因此它不会通过阻止干扰其他实时执行代码)?我想这会以某种方式将它移动到一个新的线程?
答案 0 :(得分:3)
这可以通过重复启动一个
的线程来完成slowBlockingFunction
,然后像这样:
import Control.Concurrent
repeatedlyDoSlowStuffInBackground = forkIO doStuff
where
doStuff = do
forkIO slowBlockingFunction
threadDelay (1000 * 1000 * 60 * 5)
doStuff
然后你只需在某处拨打repeatedlyDoSlowStuffInBackground
。
请注意,这不会补偿可变延迟。例如。线程因系统负载延迟2秒而被延迟,在这种情况下,它会再睡5分钟而不是仅仅睡4分58秒进行补偿