Untitled
unknown
plain_text
3 years ago
3.1 kB
8
Indexable
import xmlrpc.server
import xmlrpc.client
import threading
import time
import logging
import functools
class ConnectionPool:
def __init__(self, host, port, pool_size=10, retry_interval=5, max_retries=5):
self.host = host
self.port = port
self.pool_size = pool_size
self.retry_interval = retry_interval
self.max_retries = max_retries
self.pool = []
self.current_size = 0
self.logger = logging.getLogger(__name__)
def create_connection(self):
retries = 0
while True:
try:
proxy = xmlrpc.client.ServerProxy(f"http://{self.host}:{self.port}")
return proxy
except Exception as e:
retries += 1
if retries > self.max_retries:
raise e
time.sleep(self.retry_interval)
def get_connection(self):
if self.current_size < self.pool_size:
self.current_size += 1
return self.create_connection()
else:
while True:
if self.pool:
return self.pool.pop()
time.sleep(0.1)
def release_connection(self, connection):
self.pool.append(connection)
class RPCServer:
def __init__(self, host, port):
self.server = xmlrpc.server.SimpleXMLRPCServer((host, port))
def register_function(self, func, name=None):
self.server.register_function(func, name)
def serve_forever(self):
self.server.serve_forever()
class RPCClient:
def __init__(self, host, port, pool_size=10, retry_interval=5, max_retries=5):
self.connection_pool = ConnectionPool(host, port, pool_size, retry_interval, max_retries)
def call(self, method, *args, **kwargs):
connection = self.connection_pool.get_connection()
try:
return getattr(connection, method)(*args, **kwargs)
except xmlrpc.client.Fault as e:
if e.faultCode == -32601: # method not found
raise Exception(f"Method not found: {method}") from e
else:
raise e
except Exception as e:
raise e
finally:
self.connection_pool.release_connection(connection)
def call_async(self, method, *args, **kwargs):
@functools.wraps(method)
def wrapper(*args, **kwargs):
try:
result = self.call(method, *args, **kwargs)
self.async_result = (True, result)
except Exception as e:
self.async_result = (False, e)
thread = threading.Thread(target=wrapper, args=args, kwargs=kwargs)
thread.start()
return thread
def add(x, y):
return x + y
server = RPCServer("localhost", 8000)
server.register_function(add)
server.serve_forever()
client = RPCClient("localhost", 8000)
result = client.call("add", 1, 2)
print(result) # 3
thread = client.call_async("add", 3, 4)
thread.join()
success, result = client.async_result
if success:
print(result) # 7
else:
print(result) # Exception object
Editor is loading...