在同一应用程序中启动多个 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]