git.iko.soy/distributed-process
on 3606f3d help sign in
36 lines 1.1 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, 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 Right transport <- createTransport host port defaultTCPParameters
35 node <- newLocalNode transport initRemoteTable
36 runProcess node $ initialProcess role