1

是否有在同一个应用程序中启动两个 scotty 服务器的标准方法?在我正在尝试的玩具项目中:

main :: IO ()
main = do
  scotty 3000 $ do
    get "/" $ do
      text "hello"
  scotty 4000 $ do
    post "/" $ do
      text "world"

第一台服务器启动,但第二台没有。这也可能是我理解 Haskell IO 方式的一个缺陷。谢谢!

4

2 回答 2

4

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%
于 2020-02-19T07:51:57.993 回答
1

我会使用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]
于 2020-02-19T15:32:38.147 回答