zoukankan      html  css  js  c++  java
  • python实现远程方法调用

    先实现server端

    import json
    from multiprocessing.connection import Listener
    from threading import Thread
    
    
    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:
                    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(e))
            except EOFError:
                pass
    
    
    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
    
    
    if __name__ == '__main__':
        handler = RPCHandler()
        handler.register_function(add)
        # Run the server
        rpc_server(handler, ('127.0.0.1', 17000), authkey=b'peekaboo')

    再实现client端

    import json
    from multiprocessing.connection import Client
    
    
    class RPCProxy:
    
        def __init__(self, connection):
            self._connection = connection
    
        def __getattr__(self, name):
            def do_rpc(*args, **kwargs):
                self._connection.send(json.dumps((name, args, kwargs)))
                result = json.loads(self._connection.recv())
                if isinstance(result, Exception):
                    raise result
                return result
    
            return do_rpc
    
    
    if __name__ == '__main__':
        c = Client(('127.0.0.1', 17000), authkey=b'peekaboo')
        proxy = RPCProxy(c)
        res = proxy.add(2, 3)
        print(res)
  • 相关阅读:
    bzoj 1858 线段树
    bzoj 1877 最小费用流
    bzoj 1833 数位dp
    Codeforces Round #285 (Div. 1) B
    HDU2028 Lowest Common Multiple Plus
    HDU5706 GirlCat
    HDU2022 海选女主角
    687E: TOF
    687D: Dividing Kingdom II
    687D: Dividing Kingdom II
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/13177065.html
Copyright © 2011-2022 走看看