在同一应用程序中启动多个 scotty 服务器的最优雅方式?
Most elegant way to start several scotty servers in the same application?
有没有一种标准方法可以在同一个应用程序中启动两个 scotty 服务器?在一个玩具项目中,我正在尝试:
main :: IO ()
main = do
scotty 3000 $ do
get "/" $ do
text "hello"
scotty 4000 $ do
post "/" $ do
text "world"
第一台服务器启动但第二台没有。这也可能是我理解 Haskell IO 方式的缺陷。谢谢!
scotty
过程不会 return,它接管控制权并持续为对 webroute 的请求提供服务。如果确实如此 return 那么您将遇到控制流问题 - 当请求到达时您将如何保持端口打开?
一个解决方案是将每个对 scotty
的调用放在一个单独的线程中。例如:
#!/usr/bin/env cabal
{- cabal:
build-depends: base, scotty
-}
{-# LANGUAGE OverloadedStrings #-}
import Control.Concurrent
import Web.Scotty
main :: IO ()
main = do
forkIO $ scotty 3000 $ do
get "/" $ do
text "hello"
scotty 4000 $ do
post "/" $ do
text "world"
随着操作:
% curl -XPOST localhost:4000
world%
% curl -XGET localhost:3000
hello%
我会用 async:
import Control.Concurrent.Async
main :: IO ()
main = do
a1 <- async $ scotty 3000 $ do
get "/" $ do
text "hello"
a2 <- async $ scotty 4000 $ do
post "/" $ do
text "world"
waitAnyCatchCancel [a1, a2]
有没有一种标准方法可以在同一个应用程序中启动两个 scotty 服务器?在一个玩具项目中,我正在尝试:
main :: IO ()
main = do
scotty 3000 $ do
get "/" $ do
text "hello"
scotty 4000 $ do
post "/" $ do
text "world"
第一台服务器启动但第二台没有。这也可能是我理解 Haskell IO 方式的缺陷。谢谢!
scotty
过程不会 return,它接管控制权并持续为对 webroute 的请求提供服务。如果确实如此 return 那么您将遇到控制流问题 - 当请求到达时您将如何保持端口打开?
一个解决方案是将每个对 scotty
的调用放在一个单独的线程中。例如:
#!/usr/bin/env cabal
{- cabal:
build-depends: base, scotty
-}
{-# LANGUAGE OverloadedStrings #-}
import Control.Concurrent
import Web.Scotty
main :: IO ()
main = do
forkIO $ scotty 3000 $ do
get "/" $ do
text "hello"
scotty 4000 $ do
post "/" $ do
text "world"
随着操作:
% curl -XPOST localhost:4000
world%
% curl -XGET localhost:3000
hello%
我会用 async:
import Control.Concurrent.Async
main :: IO ()
main = do
a1 <- async $ scotty 3000 $ do
get "/" $ do
text "hello"
a2 <- async $ scotty 4000 $ do
post "/" $ do
text "world"
waitAnyCatchCancel [a1, a2]