Python多进程RPC接口设计优化:全局变量替代及包化改进咨询
解决方案:移除全局变量+优化项目结构与代码设计
一、用类封装状态替代全局变量
把服务端管理相关的状态(进程实例、RPC服务实例、运行标记)封装到类中,让状态属于实例而非全局作用域,既避免全局变量的副作用,也更符合面向对象的封装原则。
示例代码:
# src/server/manager.py import subprocess from your_rpc_library import RPCServer # 替换成实际使用的RPC库 class RPCServerManager: def __init__(self, csharp_server_path, rpc_port=5000): self._server_process = None self._rpc_server = None self._is_running = False self._csharp_path = csharp_server_path self._rpc_port = rpc_port def start(self): if self._is_running: return # 启动C#服务端进程 self._server_process = subprocess.Popen([self._csharp_path, f"--port={self._rpc_port}"]) # 初始化并启动RPC服务 self._rpc_server = RPCServer(port=self._rpc_port) self._rpc_server.start() self._is_running = True def stop(self): if not self._is_running: return # 停止RPC服务 if self._rpc_server: self._rpc_server.stop() # 终止C#进程并等待退出 if self._server_process: self._server_process.terminate() self._server_process.wait() self._is_running = False def is_running(self): return self._is_running
外部调用时只需实例化类即可:
from your_package.server.manager import RPCServerManager manager = RPCServerManager("path/to/csharp/server.exe") manager.start() # 执行业务逻辑... manager.stop()
二、优化项目结构(符合Python包规范)
调整后的结构更清晰,便于封装成可分发的Python包:
your_package/ ├── src/ │ ├── your_package/ # 包根目录,建议与项目名称一致 │ │ ├── __init__.py │ │ ├── client/ │ │ │ ├── __init__.py │ │ │ └── rpc_client.py # 封装RPC客户端调用逻辑 │ │ └── server/ │ │ ├── __init__.py │ │ └── manager.py # 存放上面的RPCServerManager类 │ └── tests/ # 测试代码目录 │ ├── __init__.py │ ├── test_client.py │ └── test_server_manager.py ├── pyproject.toml # 包配置文件,用于pip安装 └── README.md
- 在
src/your_package/__init__.py中导出核心类,简化外部调用:from .server.manager import RPCServerManager from .client.rpc_client import RPCClient __all__ = ["RPCServerManager", "RPCClient"] - 通过
pyproject.toml配置包的基本信息、依赖项,支持用pip install .将包安装到Python环境中。
三、额外代码设计建议
- 实现上下文管理器:给
RPCServerManager添加__enter__和__exit__方法,支持with语句自动管理服务启停:
调用时更简洁安全:def __enter__(self): self.start() return self def __exit__(self, exc_type, exc_val, exc_tb): self.stop()with RPCServerManager("path/to/server.exe") as manager: # 执行依赖服务端的操作 pass - 参数配置化:将C#服务端路径、RPC端口、超时时间等做成可配置参数,支持从环境变量或配置文件读取,避免硬编码。
- 添加日志记录:用Python标准库
logging替代print,记录服务启动、停止、异常等信息,方便调试和问题排查。 - 完善异常处理:在
start()和stop()方法中捕获进程启动失败、RPC连接超时等异常,抛出明确的自定义异常,让调用方更容易处理错误。 - 编写单元测试:针对
RPCServerManager和客户端逻辑编写测试用例,验证启停逻辑、异常场景,保证代码稳定性。
内容的提问来源于stack exchange,提问作者CSharper96
相关产品推荐
相关产品推荐

