如何在Python中让单个进程同时作为RPC客户端与服务器?
如何在单个Python进程中同时实现RPC服务端与客户端(P2P节点)
要让单个Python进程同时兼具RPC服务端(接收消息)和客户端(发送消息)的功能,核心是解决serve_forever()的阻塞问题——用多线程将服务端的监听逻辑与客户端的发送逻辑分离,这样进程既能持续处理外部请求,又能主动发起调用。
以下是基于你现有代码的完整实现方案:
完整代码实现
import sys import threading from xmlrpc.server import SimpleXMLRPCServer from xmlrpc.client import ServerProxy # 节点共享缓存 cache = [] def updateCache(elem): cache.append(elem) print(f"[本地缓存更新] {cache}") return "消息已更新" def start_server(port): """启动RPC服务端,运行在子线程""" server = SimpleXMLRPCServer(("localhost", port), allow_none=True) server.register_function(updateCache, "updateCache") print(f"服务端已启动,监听端口 {port}") server.serve_forever() def send_message(target_port, message): """作为客户端向目标节点发送消息""" try: proxy = ServerProxy(f"http://localhost:{target_port}") response = proxy.updateCache(message) print(f"[发送结果] 目标节点响应: {response}") except Exception as e: print(f"[发送失败] 无法连接到端口 {target_port}: {str(e)}") if __name__ == "__main__": if len(sys.argv) < 2: print("用法: python node.py <本地端口> [目标端口] [消息内容]") sys.exit(1) local_port = int(sys.argv[1]) # 启动服务端线程 server_thread = threading.Thread(target=start_server, args=(local_port,), daemon=True) server_thread.start() # 如果传入了目标端口和消息,就发送消息 if len(sys.argv) >= 4: target_port = int(sys.argv[2]) message = sys.argv[3] send_message(target_port, f"来自端口{local_port}的消息: {message}") # 保持主线程运行,避免进程退出 input("按回车键退出...\n")
关键细节说明
- 多线程分离逻辑:服务端在子线程中运行,
daemon=True确保主线程退出时子线程也会终止,不会残留进程。 - 共享缓存:
cache是全局变量,线程间共享,服务端收到的消息会直接更新到本地缓存,保证数据一致性。 - 灵活的节点交互:通过命令行参数可以指定本地端口、目标节点端口和消息内容,方便测试多节点通信。
使用示例
- 启动第一个节点(端口6789):
python node.py 6789
- 启动第二个节点(端口6790),并向第一个节点发送消息:
python node.py 6790 6789 "Hello P2P"
此时第一个节点会打印缓存更新,第二个节点会收到响应。
内容的提问来源于stack exchange,提问作者Nathan
相关产品推荐
相关产品推荐

