【问题标题】:Shared data in YesodYesod 中的共享数据
【发布时间】:2014-01-03 06:43:58
【问题描述】:

我想在 Yesod 中跨请求共享一些数据。在我的情况下,数据是MVar (Data.Map Text ReadWriteLock),但我认为共享数据的格式在这里并不重要。

在 Foundation.hs 中,有一条注释说我可以向 App 添加字段,并且每个处理程序都可以访问那里的数据。这似乎是一种我可以用来在不同处理程序之间共享数据的方法。我一直在浏览 Yesod 这本书,但我找不到任何从 App 获取数据的示例。

  • 如何从处理程序中访问新创建的字段?

我认为这可能是 STM 的一个很好的用例。我可以分享TVar (Data.Map Text ReadWriteLock)。但是创建TVar 会将TVar 包装在STM monad 中。我可能弄错了,但对我来说,整个 Yesod“主循环”似乎需要在 STM monad 中运行。

  • 在这里使用 STM 是否可行?谁能详细说明如何实现这一目标?

【问题讨论】:

  • 您需要保留这些数据吗?
  • 我不需要它坚持。我不保留数据的原因是我可以使用 RWLocks 线程将在获取时阻塞。这种方法对我来说似乎比轮询数据库来尝试获取锁更容易。如果它坚持下去会很好,但这对我来说似乎需要做更多的工作。不过我可能错了。

标签: haskell yesod


【解决方案1】:

tutorial for building a file server with Yesod 很好地展示了如何使用 STM 访问共享数据。相关部分从第二部分开始。

【讨论】:

    【解决方案2】:

    要详细说明 pxqr 的评论,您想做这样的事情。

    在您的 Foundation.hs 文件中(假设您以 yesod init 开始您的项目)。

    data App = App
        { ... other fields
        , shared :: TVar Int -- New shared TVar field
        }
    

    然后在 Application.hs 文件中创建 App 实例。

    makeFoundation conf = do
        .... snip .....
        tv <- newTVarIO 0  -- Initialize your TVar
    
        let logger = Yesod.Core.Types.Logger loggerSet' getter
            foundation = App conf s manager logger tv  -- Add TVar here
    
        return foundation
    

    然后在你的处理程序中使用 TVar

    getHomeR :: Handler Html
    getHomeR = do
        app <- getYesod  -- Get the instance of App
        x <- liftIO $ atomically $ do -- Read and update the TVar value.
          val <- readTVar (shared app)
          writeTVar (shared app) (val + 1)
          return val
        (formWidget, formEnctype) <- generateFormPost sampleForm
        let submission = Nothing :: Maybe (FileInfo, Text)
            handlerName = "getHomeR" :: Text
        defaultLayout $ do
            aDomId <- newIdent
             -- Use the TVar value (increments on each page refresh).
            setTitle $  fromString (show x)
            $(widgetFile "homepage")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-04
      • 2011-08-22
      • 2013-01-22
      • 1970-01-01
      相关资源
      最近更新 更多