git.iko.soy/distributed-process
on pr-327 help sign in
39 lines 1.2 kB history raw
1import System.Environment
2import Control.Monad
3import Control.Applicative
4import Control.Distributed.Process
5import Control.Distributed.Process.Node
6import Network.Transport.TCP (createTransport, defaultTCPAddr, defaultTCPParameters)
7import Data.Binary (encode, decode)
8import qualified Data.ByteString.Lazy as BSL
10pingServer :: Process ()
11pingServer = forever $ do
12 them <- expect
13 send them ()
15pingClient :: Int -> ProcessId -> Process ()
16pingClient n them = do
17 us <- getSelfPid
18 replicateM_ n $ send them us >> (expect :: Process ())
19 liftIO . putStrLn $ "Did " ++ show n ++ " pings"
21initialProcess :: String -> Process ()
22initialProcess "SERVER" = do
23 us <- getSelfPid
24 liftIO $ BSL.writeFile "pingServer.pid" (encode us)
25 pingServer
26initialProcess "CLIENT" = do
27 n <- liftIO $ getLine
28 them <- liftIO $ decode <$> BSL.readFile "pingServer.pid"
29 pingClient (read n) them
31main :: IO ()
32main = do
33 [role, host, port] <- getArgs
34 trans <- createTransport
35 (defaultTCPAddr host port) defaultTCPParameters
36 case trans of
37 Right transport -> do node <- newLocalNode transport initRemoteTable
38 runProcess node $ initialProcess role
39 Left other -> error $ show other