Warp/WAI的线程安全状态

npo*_*cop 4 concurrency state haskell haskell-wai haskell-warp

我想写一个web服务器,Statewai/ 将它的状态存储在monad中warp.像这样的东西:

{-# LANGUAGE OverloadedStrings #-}
import Network.Wai
import Network.Wai.Handler.Warp
import Network.HTTP.Types
import Control.Monad.State
import Data.ByteString.Lazy.Char8

main = run 3000 app

text x = responseLBS
        status200
        [("Content-Type", "text/plain")]
    x

app req = return $ text "Hello World"

app1 req = modify (+1) >>= return . text . pack . show

-- main1 = runStateT (run 3000 app1) 0
Run Code Online (Sandbox Code Playgroud)

当然,注释行不起作用.目的是将计数器存储在状态monad中,并在每个请求上显示其递增值.

另外,我如何获得线程安全?warp是顺序还是并行运行我的中间件?

有什么选择可用于州 - 除了IORef我可以在这种情况下使用之外还有什么吗?

我理解国家给予安全,但似乎wai不允许国家.

我只需要一个可以从其他地方调用的简单的单线程RPC.Haxr包需要一个单独的Web服务器,这是一个过度的.请参阅从Node.JS调用Haskell - 它没有任何建议,因此我使用Wai/Warp和Aeson编写了一个简单的服务器.但似乎WAI旨在支持并发实现,因此它使事情复杂化.

Don*_*art 5

如果它是Statemonad,它的设计是线程安全的.对共享状态没有可能的并发IO操作.它是线程安全的,或者它不会编译.

如果你有真正的并行访问共享状态(独立forkIO线程更新全局计数器IE)设计的一部分,那么你就需要使用和MVarTVarSTM单子(或其他一些事务性障碍),以确保原子.