haskell - Haskell中的计时器(Control.Concurrent.Timer):重复执行
问题描述
试图找出处理 Haskell 中重复操作的最佳实践,使用Control.Concurrent.Timer
. 找不到好的例子。
假设我重复了必须在应用程序中完成的操作。假设它正在从某个网页获取数据。
import Control.Concurrent.Suspend.Lifted
import Control.Concurrent.Timer
main :: IO ()
main = do
url <- fetchUrl :: IO Url
doSomethingWithUrl url
我希望在 main 中重复获取 url,以便数据始终是最新的。怎么可能做到?
解决方案
您的需求听起来适合 IORef 或 MVar。键入且未测试的代码是:
import Data.IORef (readIORef, writeIORef, newIORef)
import Control.Concurrent (threadDelay,forkIO)
import Control.Monad (void)
main :: IO ()
main = do
ref <- newIORef mempty {- or default value -}
_ <- forkIO (updatePeriodically fetchUrl ref)
scotty $ do
liftIO (readIORef ref) >>= etcEtc
updatePeriodically :: (IO SomeType) -> IORef SomeType -> IO ()
updatePeriodically op ref =
let update = op >>= writeIORef ref
forever $ threadDelay periodInMicroSeconds >> void (forkIO update)
这并不完美,如果其中一个fetchUrl
调用被严重延迟,那么它的写入可能会破坏一个快速返回的新调用。这可能是一个小问题,但您可以使用计数器以及比较和交换操作来处理它。
推荐阅读
- angular - “未捕获(承诺中):SyntaxError: Unexpected token ' in JSON at position 2” 如何修复此错误?
- ace-editor - 如何在ace editor中设置request返回的单词的立即关联?
- android - NavDeepLinkBuilder:深度链接到 startDestination
- android - 如何使用firebase实时数据库在具有分页的android中的recyclerview列表中实现搜索?
- javascript - window.print() ,谷歌映射截图之间的空白
- java - 有时,一个唯一 id 的消费者组确实会被创建,并且消费者在没有分区的情况下被卡住
- javascript - 错误:
: 函数未声明为可配置 - database - 我应该使用内存数据库来存储聊天日志吗?
- php - 编码url参数,需要简短
- pandas - 在熊猫中按日、月和时间(而不是按年)合并 xlsx 文件