Skip to content

Instantly share code, notes, and snippets.

@mmakowski
Created December 22, 2011 19:21
Show Gist options
  • Save mmakowski/1511492 to your computer and use it in GitHub Desktop.
Save mmakowski/1511492 to your computer and use it in GitHub Desktop.
cfgRole MASTER
cfgHostName localhost
{-
One process starts the master process
Other start do-nothing process
master distributes the work among the other processes
-}
module Main where
import Remote
import Control.Monad
main :: IO ()
main = remoteInit (Just "config") [] initialProcess
{-
the argument defines the role. All nodes run from the same executable, the config defines which
role the node should assume and then this function branches off depending on the role.
-}
initialProcess :: String -> ProcessM ()
initialProcess "MASTER" = masterProcess
initialProcess "SLAVE" = slaveProcess
initialProcess role = error $ "Unknown role " ++ role
masterProcess :: ProcessM ()
masterProcess = do
peers <- getPeers
let slaves = findPeerByRole peers "SLAVE"
myPid <- getSelfPid
forM_ slaves (receiveMessage myPid)
receiveMessage :: ProcessId -> NodeId -> ProcessM ()
receiveMessage myPid node = do
Just pid <- nameQuery node "main"
send pid myPid
msg <- expect
say $ "message: " ++ msg
slaveProcess :: ProcessM ()
slaveProcess = do
nameSet "main"
pid <- expect
send pid "PONG"
@mmakowski
Copy link
Author

To run the master/slave version:

mkdir slave
cat config | sed s/MASTER/SLAVE/ > slave/config
ghc --make Remoting.hs -o remoting
cd slave
../remoting &
cd ..
./remoting

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment