You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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是全局变量,线程间共享,服务端收到的消息会直接更新到本地缓存,保证数据一致性。
  • 灵活的节点交互:通过命令行参数可以指定本地端口、目标节点端口和消息内容,方便测试多节点通信。

使用示例

  1. 启动第一个节点(端口6789):
python node.py 6789
  1. 启动第二个节点(端口6790),并向第一个节点发送消息:
python node.py 6790 6789 "Hello P2P"

此时第一个节点会打印缓存更新,第二个节点会收到响应。

内容的提问来源于stack exchange,提问作者Nathan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:30:58