Самый элегантный способ запустить несколько серверов Скотти в одном приложении? - PullRequest
1 голос
/ 19 февраля 2020

Есть ли стандартный способ запустить два сервера Скотти в одном приложении? В игрушечном проекте я пытаюсь:

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

Первый сервер запускается, а второй - нет. Это также может быть недостатком в моем понимании Haskell IO. Спасибо!

Ответы [ 2 ]

3 голосов
/ 19 февраля 2020

Процедура scotty не возвращается, она берет на себя управление и постоянно обслуживает запросы веб-маршрутов. Если он вернется, у вас возникнет проблема с потоком управления - как вы будете держать порт открытым для получения запроса?

Одно из решений - поместить каждый вызов на 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%
0 голосов
/ 19 февраля 2020

Я бы использовал asyn c:

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]
...