【发布时间】: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 线程将在获取时阻塞。这种方法对我来说似乎比轮询数据库来尝试获取锁更容易。如果它坚持下去会很好,但这对我来说似乎需要做更多的工作。不过我可能错了。