Source code for sesf.msgtransfer2.user_node
"""
Module **sesf.msgtransfer2.user_node** has class ``UserNode`` that
implements a user node that starts a given msgtransfer2 node.
If the peer user node is also started, the two user nodes exercise
the msgtransfer2 service provided by the two msgtransfer2 nodes.
For example:
- Run ``python user_node.py 2 0 --use imp_0.node 2 0`` to start a process
that starts ``UserNode`` 0 which starts ``msgtransfer2.imp_0.Node`` 0.
- Run ``python user_node.py 2 1 --use imp_0.node 2 1`` to start a process
that starts ``UserNode`` 1 which starts ``msgtransfer2.imp_0.Node`` 1.
- Or, instead of the above two commands, run
``python ../start_nodes.py 2 user_node.py --use imp_0.node``.)
The two user nodes use the service provided by the two msgtransfer2 nodes
to exchange a few messages, then end the msgtransfer2 service and the
two processes.
The user nodes can also make use of a running msgtransfer2 *servicemodel*,
instead of a msgtransfer2 implementation. Simply replace ``imp_0.node``
by ``service_node`` in the above commands.
"""
from threading import Thread
import importlib, random, time, argparse, sys
[docs]class UserNode():
def __init__(self, argv):
p = argparse.ArgumentParser(
usage='python user_node.py [-h] num_nodes myid --use node_argv',
description='create UserNode using msgtransfer2 node_argv')
p.add_argument("num_nodes", type=int, help='number of nodes')
p.add_argument("myid", type=int,
help='id of this node, in 0..num_nodes-1')
p.add_argument("--use", nargs=argparse.REMAINDER,
help='zero or more "--use node_argv" strings')
args = p.parse_args(argv[1:])
print("create node from args:", args)
if args.use == None:
print("Using sesf.msgtransfer2.imp_0.node for msgtransfer2 node")
nodemodule = importlib.import_module('sesf.msgtransfer2.imp_0.node')
mtnode = nodemodule.Node(
['placeholder', str(args.num_nodes), str(args.myid)])
else:
nodemodule = importlib.import_module(args.use[0])
print("creating_node_from_module", nodemodule)
mtnode = nodemodule.Node(args.use)
print("msgtransfer2 node", mtnode)
self.num_nodes = 2
self.myid = args.myid
self.mtnode = mtnode
self.recv_thread = Thread(target=self.do_recvs)
self.recv_thread.start()
print('starting user', self.num_nodes, self.myid, self.mtnode)
def do_recvs(self):
while True:
rval = self.mtnode.recv()
print("user rcvd", rval, flush=True)
if rval == (False,):
break
def do_sends(self):
for i in range(5):
time.sleep(2*random.random())
msg = random.randint(0, 1000)
print("user send", msg, flush=True)
rval = self.mtnode.send(msg)
if not rval:
break
##### END class UserNode in module msgtransfer2.user_node ################
if __name__ == '__main__':
usernode = UserNode(sys.argv)
usernode.do_sends()
time.sleep(1)
if usernode.myid == 0:
print("mtnode.end called", flush=True)
usernode.mtnode.end()
usernode.recv_thread.join()
print("usernode ended", flush=True)
time.sleep(2)