是否有在同一个应用程序中启动两个 scotty 服务器的标准方法?在我正在尝试的玩具项目中:
main :: IO ()
main = do
scotty 3000 $ do
get "/" $ do
text "hello"
scotty 4000 $ do
post "/" $ do
text "world"
第一台服务器启动,但第二台没有。这也可能是我理解 Haskell IO 方式的一个缺陷。谢谢!
该scotty
过程不会返回,它会接管控制权并不断地为 webroutes 提供请求。如果它确实返回,那么您将遇到控制流问题 - 当请求到达时,您将如何保持端口打开?
一种解决方案是将每个调用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]