У меня есть следующее Скотти приложение, которое пытается использовать STM для поддержания количества обслуженных вызовов API:
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Web.Scotty
import Data.Monoid (mconcat)
import Control.Concurrent.STM
import Control.Monad.IO.Class
main :: IO ()
main = do
counter <- newTVarIO 0
scotty 3000 $
get "/:word" $ do
liftIO $ atomically $ do
counter' <- readTVar counter
writeTVar counter (counter' + 1)
liftIO $ do
counter' <- atomically (readTVar counter)
print counter'
beam <- param "word"
html $ mconcat ["<h1>Scotty, ", beam, " me up!</h1>"]
Я "загружаю тест" API следующим образом:
ab -c 100 -n 100000 http://127.0.0.1:3000/z
Однако API обслуживает около 16 тысяч запросов, а затем «зависает» - ab
останавливается с ошибкой apr_socket_recv: Operation timed out (60)
.
Я думаю, что неправильно использую STM, но неуверен, что я делаю не так.Есть предложения?