Created
April 10, 2015 17:15
-
-
Save Averroes/658988cc332d6160f27d to your computer and use it in GitHub Desktop.
implementing remote procedure call
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # rpcserver.py | |
| import json | |
| class RPCHandler: | |
| def __init__(self): | |
| self._functions = { } | |
| def register_function(self, func): | |
| self._functions[func.__name__] = func | |
| def handle_connection(self, connection): | |
| try: | |
| while True: | |
| # Receive a message | |
| func_name, args, kwargs = json.loads(connection.recv()) | |
| # Run the RPC and send a response | |
| try: | |
| r = self._functions[func_name](*args,**kwargs) | |
| connection.send(json.dumps(r)) | |
| except Exception as e: | |
| connection.send(json.dumps(str(e))) | |
| except EOFError: | |
| pass | |
| # Example use | |
| from multiprocessing.connection import Listener | |
| from threading import Thread | |
| def rpc_server(handler, address, authkey): | |
| sock = Listener(address, authkey=authkey) | |
| while True: | |
| client = sock.accept() | |
| t = Thread(target=handler.handle_connection, args=(client,)) | |
| t.daemon = True | |
| t.start() | |
| # Some remote functions | |
| def add(x, y): | |
| return x + y | |
| def sub(x, y): | |
| return x - y | |
| # Register with a handler | |
| handler = RPCHandler() | |
| handler.register_function(add) | |
| handler.register_function(sub) | |
| # Run the server | |
| rpc_server(handler, ('localhost', 17000), authkey=b'peekaboo') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment