Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
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 commented Jan 8, 2012

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 ..
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment