news 2026/9/15 20:37:06

Python模块开发实战:从基础到高级技巧

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python模块开发实战:从基础到高级技巧

1. Python模块开发的核心价值

在Python生态中,模块化开发是构建可维护、可复用代码的基础单元。一个设计良好的Python模块能像乐高积木一样,在不同项目中灵活组合使用。我见过太多开发者把全部代码堆在单个.py文件里,随着功能增加最终变成难以维护的"意大利面条代码"。

Python模块本质上就是一个包含Python定义和语句的.py文件。它的文件名就是模块名(去掉.py后缀)。比如我们常见的math.pyos.py都是标准库中的经典模块案例。通过模块化开发,我们可以:

  • 将相关功能组织在一起,形成清晰的代码结构
  • 避免命名冲突(不同模块可以有同名函数)
  • 实现代码复用,减少重复开发
  • 便于团队协作开发

经验之谈:在中小型项目中,我建议单个模块代码量控制在300-800行之间。超过这个范围就该考虑拆分子模块了。曾经维护过一个2000行的单体模块,光是理解函数调用关系就花了整整两天。

2. 模块开发全流程实战

2.1 创建基础模块结构

我们先从最简单的模块开始。创建一个calculator.py文件:

""" calculator.py - 简易计算器模块 支持加减乘除四则运算 """ def add(a, b): """返回两个数的和""" return a + b def subtract(a, b): """返回两个数的差""" return a - b

这个基础模块已经可以正常使用了。在其他Python文件中可以通过import calculator来调用这些函数。但专业的模块开发还需要考虑更多因素:

  1. 版本控制:在模块顶部添加__version__变量
  2. 类型提示:Python 3.5+建议添加类型注解
  3. 异常处理:对可能出错的操作添加try-except

改进后的版本:

#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ calculator.py - 简易计算器模块 版本: 1.1.0 """ from typing import Union __version__ = "1.1.0" __all__ = ['add', 'subtract', 'Calculator'] def add(a: Union[int, float], b: Union[int, float]) -> Union[int, float]: """返回两个数的和 Args: a: 第一个操作数 b: 第二个操作数 Returns: 两数之和 Raises: TypeError: 当参数不是数字类型时抛出 """ if not isinstance(a, (int, float)) or not isinstance(b, (int, float)): raise TypeError("操作数必须是数字类型") return a + b

2.2 模块的打包与分发

要让你的模块能被pip安装,需要创建标准的包结构:

my_calculator/ ├── LICENSE ├── pyproject.toml ├── README.md ├── src/ │ └── my_calculator/ │ ├── __init__.py │ ├── calculator.py │ └── advanced.py └── tests/ ├── test_basic.py └── test_advanced.py

关键文件说明:

  1. pyproject.toml- 现代Python项目的构建配置文件
  2. __init__.py- 将目录标记为Python包(可以是空文件)
  3. setup.pypyproject.toml- 包安装配置

一个最小化的pyproject.toml示例:

[build-system] requires = ["setuptools>=42"] build-backend = "setuptools.build_meta" [project] name = "my-calculator" version = "1.0.0" authors = [ {name = "Your Name", email = "your.email@example.com"}, ] description = "A simple calculator module" readme = "README.md" requires-python = ">=3.7" classifiers = [ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ] [project.urls] Homepage = "https://github.com/yourname/my-calculator"

2.3 高级模块特性实现

2.3.1 模块级配置

有时我们需要在模块级别保存一些状态或配置。可以通过模块全局变量和配置函数实现:

# config.py _DEFAULT_PRECISION = 2 def get_precision() -> int: """获取当前计算精度""" return _DEFAULT_PRECISION def set_precision(precision: int): """设置计算精度 Args: precision: 小数位数 (0-8) """ global _DEFAULT_PRECISION if not 0 <= precision <= 8: raise ValueError("精度必须在0-8之间") _DEFAULT_PRECISION = precision
2.3.2 延迟加载大型模块

对于包含大量依赖或初始化耗时的模块,可以使用懒加载技术:

# lazy_module.py _lazy_imports = {} def __getattr__(name): if name == "numpy": import numpy as np _lazy_imports['numpy'] = np return np raise AttributeError(f"module {__name__!r} has no attribute {name!r}")

3. 模块开发最佳实践

3.1 文档规范

良好的文档是模块可用的关键。Python社区普遍遵循以下约定:

  1. 模块文档字符串:文件顶部三引号字符串,说明模块用途
  2. 函数文档字符串:每个函数/方法下的三引号说明
  3. 类型注解:Python 3.5+推荐使用类型提示
  4. 示例代码:在文档字符串中包含使用示例

Google风格的文档字符串示例:

def calculate_tax(income: float, rate: float = 0.1) -> float: """计算应缴税额 Args: income: 收入金额 rate: 税率 (默认为0.1) Returns: 计算得出的税额 Raises: ValueError: 当收入或税率为负数时抛出 Examples: >>> calculate_tax(1000) 100.0 >>> calculate_tax(5000, 0.2) 1000.0 """ if income < 0 or rate < 0: raise ValueError("收入和税率不能为负数") return income * rate

3.2 测试策略

为模块编写测试是保证质量的关键步骤。使用unittestpytest框架:

# test_calculator.py import unittest from calculator import add class TestCalculator(unittest.TestCase): def test_add_integers(self): self.assertEqual(add(2, 3), 5) def test_add_floats(self): self.assertAlmostEqual(add(0.1, 0.2), 0.3, places=7) def test_add_invalid_type(self): with self.assertRaises(TypeError): add("2", 3)

使用pytest可以获得更简洁的测试代码:

# test_with_pytest.py import pytest from calculator import add def test_add_numbers(): assert add(2, 3) == 5 assert add(0.1, 0.2) == pytest.approx(0.3) def test_add_invalid(): with pytest.raises(TypeError): add("2", 3)

3.3 性能优化技巧

  1. 使用__slots__减少内存占用

    class Point: __slots__ = ['x', 'y'] # 固定属性列表 def __init__(self, x, y): self.x = x self.y = y
  2. 缓存计算结果

    from functools import lru_cache @lru_cache(maxsize=128) def factorial(n): if n == 0: return 1 return n * factorial(n-1)
  3. 使用C扩展加速关键代码

    • 通过ctypes调用C函数
    • 使用Cython编写扩展
    • 或者用PyBind11创建C++扩展

4. 常见问题与解决方案

4.1 循环导入问题

当模块A导入模块B,同时模块B又导入模块A时,就会发生循环导入。解决方案:

  1. 重构代码:将共享代码提取到第三个模块C
  2. 延迟导入:在函数内部导入需要的模块
  3. 使用接口模式:定义抽象基类来解耦

错误示例:

# a.py from b import B class A: def use_b(self): return B()
# b.py from a import A class B: def use_a(self): return A()

修正方案:

# interfaces.py class AInterface: pass class BInterface: pass
# a.py from interfaces import BInterface class A(AInterface): def use_b(self): from b import B # 延迟导入 return B()

4.2 版本兼容性问题

处理不同Python版本兼容性的几种方法:

  1. 条件导入

    try: from typing import Literal # Python 3.8+ except ImportError: from typing_extensions import Literal
  2. 版本检查

    import sys if sys.version_info < (3, 7): raise RuntimeError("需要Python 3.7或更高版本")
  3. 兼容层

    # compat.py import sys if sys.version_info >= (3, 9): from collections.abc import Sequence else: from typing import Sequence

4.3 模块发布流程

  1. 本地测试安装

    pip install -e .
  2. 构建分发包

    python -m build
  3. 上传到PyPI

    twine upload dist/*
  4. 版本更新流程

    • 遵循语义化版本控制(SemVer)
    • 更新pyproject.toml中的版本号
    • 添加变更日志(CHANGELOG.md)

发布经验:第一次发布前务必在TestPyPI上测试完整流程。我曾经因为忘记更新版本号导致上传失败,又因为PyPI不允许重复版本号而不得不发布一个新版本。

5. 进阶模块开发技巧

5.1 动态模块加载

有时我们需要根据运行时条件加载不同模块:

import importlib def load_processor(processor_type): module_name = f"{processor_type}_processor" try: module = importlib.import_module(f"processors.{module_name}") return module.Processor() except ImportError: raise ValueError(f"不支持的处理器类型: {processor_type}")

5.2 模块钩子与元编程

通过importlibsys.meta_path可以实现自定义模块加载逻辑:

import sys from importlib.abc import MetaPathFinder, Loader from importlib.util import spec_from_loader class RemoteModuleFinder(MetaPathFinder): def find_spec(self, fullname, path, target=None): if fullname.startswith("remote_"): return spec_from_loader(fullname, RemoteLoader()) return None class RemoteLoader(Loader): def create_module(self, spec): # 实现从远程服务器加载模块代码 return None def exec_module(self, module): # 执行远程加载的代码 module.__dict__["data"] = "从远程加载的数据" sys.meta_path.append(RemoteModuleFinder())

5.3 模块安全考虑

  1. 输入验证:对所有外部输入进行严格验证
  2. 沙箱执行:对不受信任的代码使用ast模块解析而非直接exec
  3. 权限控制:限制文件系统访问和网络访问
  4. 依赖审计:定期检查依赖项的安全漏洞

安全模块加载示例:

import ast def safe_eval(expr): """安全评估数学表达式""" try: node = ast.parse(expr, mode='eval') except SyntaxError: raise ValueError("无效的表达式") for n in ast.walk(node): if isinstance(n, ast.Call): raise ValueError("函数调用不被允许") if not isinstance(n, (ast.Expression, ast.Name, ast.Num, ast.operator, ast.unaryop)): raise ValueError("不支持的语法结构") return eval(compile(node, '<string>', 'eval'), {'__builtins__': None}, {})

6. 模块设计模式

6.1 工厂模式模块

创建一个shape_factory.py

from typing import Dict, Type from shapes import Circle, Square, Triangle class ShapeFactory: _shapes: Dict[str, Type] = { 'circle': Circle, 'square': Square, 'triangle': Triangle } @classmethod def create_shape(cls, shape_type: str, *args, **kwargs): if shape_type not in cls._shapes: raise ValueError(f"未知的形状类型: {shape_type}") return cls._shapes[shape_type](*args, **kwargs) @classmethod def register_shape(cls, name: str, shape_class: Type): if name in cls._shapes: raise ValueError(f"形状类型已存在: {name}") cls._shapes[name] = shape_class

6.2 单例模式模块

实现一个全局配置模块:

# config.py class _AppConfig: def __init__(self): self._settings = {} def set(self, key, value): self._settings[key] = value def get(self, key, default=None): return self._settings.get(key, default) _config = _AppConfig() def get_config(): return _config

6.3 插件系统架构

构建一个可扩展的插件系统:

# plugin_system.py import importlib from pathlib import Path from typing import Dict, Type class PluginBase: """所有插件必须继承的基类""" name: str = "base" def execute(self, *args, **kwargs): raise NotImplementedError class PluginManager: def __init__(self): self._plugins: Dict[str, Type[PluginBase]] = {} def load_plugins(self, plugin_dir: str): """从指定目录加载所有插件""" for path in Path(plugin_dir).glob("*.py"): module_name = path.stem if module_name.startswith("_"): continue module = importlib.import_module(f"plugins.{module_name}") for attr in dir(module): if attr.startswith("_"): continue cls = getattr(module, attr) if isinstance(cls, type) and issubclass(cls, PluginBase) and cls is not PluginBase: self._plugins[cls.name] = cls def get_plugin(self, name: str) -> PluginBase: """获取插件实例""" if name not in self._plugins: raise KeyError(f"找不到插件: {name}") return self._plugins[name]()

7. 模块性能分析与优化

7.1 性能分析工具

  1. cProfile:内置的性能分析模块

    import cProfile import my_module cProfile.run('my_module.expensive_function()')
  2. line_profiler:逐行分析

    @profile def slow_function(): # 需要分析的代码 pass
  3. memory_profiler:内存使用分析

    @profile def memory_intensive_function(): # 内存密集型操作 pass

7.2 优化策略

  1. 减少全局变量访问:局部变量访问更快
  2. 使用内置函数:如map()filter()
  3. 避免不必要的对象创建:特别是在循环中
  4. 使用生成器:处理大数据集时节省内存
  5. 使用更高效的数据结构:如collections.defaultdict

优化示例:

# 优化前 def process_data(data): result = [] for item in data: processed = complex_operation(item) if processed is not None: result.append(processed) return result # 优化后 def process_data(data): return [ processed for item in data if (processed := complex_operation(item)) is not None ]

7.3 Cython加速

对于计算密集型模块,可以使用Cython进行加速:

  1. 创建module.pyx文件:

    # distutils: language = c++ # cython: language_level=3 def compute(int n): cdef int i, result = 0 for i in range(n): result += i * i return result
  2. 创建setup.py

    from setuptools import setup from Cython.Build import cythonize setup( ext_modules=cythonize("module.pyx"), )
  3. 编译安装:

    python setup.py build_ext --inplace

8. 跨平台模块开发

8.1 处理平台差异

import platform import sys if platform.system() == "Windows": # Windows特有实现 DEFAULT_CONFIG_PATH = "C:\\ProgramData\\myapp\\config.ini" else: # Unix-like系统实现 DEFAULT_CONFIG_PATH = "/etc/myapp/config.ini" def get_tmp_dir(): """获取系统临时目录""" if platform.system() == "Windows": import win32api return win32api.GetTempPath() else: return "/tmp"

8.2 条件依赖管理

pyproject.toml中指定可选依赖:

[project.optional-dependencies] gui = ["PyQt5 >= 5.15"] # GUI相关依赖 speedup = ["numpy", "numba"] # 加速相关依赖

安装时指定额外依赖:

pip install mypackage[gui,speedup]

8.3 多版本兼容

处理Python 2/3兼容性的技巧:

# compat.py import sys PY3 = sys.version_info[0] == 3 if PY3: text_type = str binary_type = bytes else: text_type = unicode binary_type = str def to_bytes(s, encoding='utf-8'): """将字符串转换为bytes""" if isinstance(s, binary_type): return s return s.encode(encoding)

9. 模块调试技巧

9.1 日志记录最佳实践

import logging from pathlib import Path def setup_logging(name, log_dir="logs", level=logging.INFO): """配置模块日志记录""" Path(log_dir).mkdir(exist_ok=True) logger = logging.getLogger(name) logger.setLevel(level) formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) # 文件处理器 file_handler = logging.FileHandler(f"{log_dir}/{name}.log") file_handler.setFormatter(formatter) logger.addHandler(file_handler) # 控制台处理器 console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) logger.addHandler(console_handler) return logger

9.2 交互式调试

  1. 使用pdb

    import pdb def buggy_function(): x = 1 y = 0 pdb.set_trace() # 设置断点 return x / y
  2. IPython嵌入

    from IPython import embed def debug_function(): # ...一些代码... embed() # 进入IPython shell # ...更多代码...
  3. breakpoint()内置函数(Python 3.7+):

    def test_function(): breakpoint() # 进入调试器 # 等同于import pdb; pdb.set_trace()

9.3 异常处理策略

import logging from typing import Optional logger = logging.getLogger(__name__) class AppError(Exception): """应用基础异常""" pass def safe_operation(): """带有完善错误处理的操作""" try: # 可能失败的操作 result = risky_call() except (ValueError, TypeError) as e: logger.error("输入数据无效: %s", e) raise AppError("处理失败: 无效输入") from e except IOError as e: logger.error("IO操作失败: %s", e) raise AppError("处理失败: 系统错误") from e except Exception as e: logger.exception("未预期的错误") raise AppError("处理失败: 未知错误") from e else: logger.debug("操作成功完成") return result finally: cleanup_resources()

10. 模块维护与演进

10.1 版本管理策略

  1. 语义化版本控制(SemVer)

    • MAJOR:不兼容的API修改
    • MINOR:向下兼容的功能新增
    • PATCH:向下兼容的问题修正
  2. 弃用策略

    import warnings from functools import wraps def deprecated(message): def decorator(func): @wraps(func) def wrapper(*args, **kwargs): warnings.warn( f"{func.__name__}已弃用: {message}", DeprecationWarning, stacklevel=2 ) return func(*args, **kwargs) return wrapper return decorator @deprecated("请使用new_function()替代") def old_function(): pass

10.2 变更日志规范

CHANGELOG.md示例:

# 变更日志 ## [1.2.0] - 2023-07-15 ### 新增 - 添加了对Python 3.11的支持 - 新增`process_batch()`方法用于批量处理 ### 变更 - 优化了缓存机制,内存占用减少30% - `Config`类现在支持上下文管理器协议 ### 修复 - 修复了在Windows平台下的路径处理问题 - 解决了多线程环境中的竞态条件 ## [1.1.0] - 2023-05-10 ...

10.3 向后兼容保证

  1. API兼容性检查工具

    import inspect from typing import Dict, List def get_api_signatures(module): """获取模块的公共API签名""" api = {} for name in dir(module): if name.startswith("_"): continue obj = getattr(module, name) if inspect.isfunction(obj): api[name] = inspect.signature(obj) elif inspect.isclass(obj): api[name] = { "methods": { m: inspect.signature(getattr(obj, m)) for m in dir(obj) if not m.startswith("_") and inspect.ismethod(getattr(obj, m)) } } return api
  2. 兼容性测试策略

    • 维护主要版本的测试分支
    • 使用tox测试多版本兼容性
    • 定期运行旧版本测试套件

11. 模块文档生成

11.1 Sphinx文档系统

  1. 安装Sphinx:

    pip install sphinx sphinx-quickstart docs
  2. 配置docs/conf.py

    import os import sys sys.path.insert(0, os.path.abspath('../src')) extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.viewcode', 'sphinx.ext.napoleon' ]
  3. 编写.rst文件:

    .. automodule:: my_module :members: :undoc-members: :show-inheritance:
  4. 生成HTML文档:

    cd docs && make html

11.2 自动化文档部署

使用ReadTheDocs实现持续文档部署:

  1. 创建.readthedocs.yaml

    version: 2 build: os: ubuntu-20.04 tools: python: "3.9" sphinx: configuration: docs/conf.py
  2. 配置文档构建依赖:

    # docs/requirements.txt sphinx>=4.0 sphinx-rtd-theme>=0.5

11.3 交互式文档示例

使用Jupyter Notebook创建可执行的文档示例:

# docs/examples/usage.ipynb { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 模块使用示例\n", "\n", "演示主要功能的使用方法" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from my_module import Calculator\n", "\n", "calc = Calculator()\n", "print(calc.add(2, 3))" ] } ] }

12. 模块生态系统集成

12.1 与流行框架集成

12.1.1 Flask集成示例
from flask import Flask from my_module import Calculator app = Flask(__name__) calc = Calculator() @app.route('/add/<float:a>/<float:b>') def add(a, b): return {'result': calc.add(a, b)} @app.route('/health') def health(): return {'status': 'healthy'}
12.1.2 Django集成示例
# calculator/views.py from django.http import JsonResponse from my_module import Calculator calc = Calculator() def api_add(request, a, b): return JsonResponse({'result': calc.add(float(a), float(b))})

12.2 命令行接口开发

使用click创建命令行工具:

# cli.py import click from my_module import Calculator @click.group() def cli(): pass @cli.command() @click.argument('a', type=float) @click.argument('b', type=float) def add(a, b): """计算两个数的和""" result = Calculator().add(a, b) click.echo(f"结果: {result}") if __name__ == '__main__': cli()

12.3 异步支持

为模块添加异步支持:

# async_calculator.py import asyncio from typing import Awaitable class AsyncCalculator: async def add(self, a: float, b: float) -> Awaitable[float]: """异步加法运算""" await asyncio.sleep(0.1) # 模拟IO操作 return a + b async def batch_add(self, pairs: list[tuple[float, float]]) -> list[float]: """批量异步加法""" tasks = [self.add(a, b) for a, b in pairs] return await asyncio.gather(*tasks)

13. 模块安全加固

13.1 输入验证策略

import re from typing import Any def validate_input(input_data: Any, pattern: str = None, min_len: int = None, max_len: int = None, allowed_types: tuple = (str,)): """通用输入验证函数 Args: input_data: 要验证的输入数据 pattern: 正则表达式模式 min_len: 最小长度 max_len: 最大长度 allowed_types: 允许的数据类型 Returns: 验证后的数据 Raises: ValueError: 当验证失败时抛出 """ if not isinstance(input_data, allowed_types): raise ValueError(f"输入类型必须是: {allowed_types}") if min_len is not None and len(input_data) < min_len: raise ValueError(f"输入长度不能小于{min_len}") if max_len is not None and len(input_data) > max_len: raise ValueError(f"输入长度不能大于{max_len}") if pattern is not None and not re.fullmatch(pattern, input_data): raise ValueError("输入格式无效") return input_data

13.2 安全审计要点

  1. 依赖审计

    pip install safety safety check
  2. 代码静态分析

    pip install bandit bandit -r my_module/
  3. 敏感信息检测

    pip install detect-secrets detect-secrets scan --update .secrets.baseline

13.3 加密与安全存储

# secure_storage.py import os from cryptography.fernet import Fernet from typing import Union class SecureStorage: def __init__(self, key: bytes = None): self.key = key or Fernet.generate_key() self.cipher = Fernet(self.key) def encrypt(self, data: Union[str, bytes]) -> bytes: """加密数据""" if isinstance(data, str): data = data.encode('utf-8') return self.cipher.encrypt(data) def decrypt(self, token: bytes) -> str: """解密数据""" return self.cipher.decrypt(token).decode('utf-8') @staticmethod def generate_key_file(path: str): """生成并保存密钥文件""" key = Fernet.generate_key() with open(path, 'wb') as f: f.write(key) os.chmod(path, 0o400) # 只读权限

14. 模块发布与持续集成

14.1 GitHub Actions自动化

.github/workflows/test.yml示例:

name: Test on: [push, pull_request] jobs: test: runs-on: ubuntu-latest strategy: matrix: python-version: ["3.7", "3.8", "3.9", "3.10"] steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip pip install -e .[test] - name: Run tests run: | pytest --cov=my_module --cov-report=xml - name: Upload coverage uses: codecov/codecov-action@v1

14.2 多平台测试策略

使用tox进行多环境测试:

# tox.ini [tox] envlist = py37, py38, py39, py310, flake8, mypy [testenv] deps = pytest>=6.0 pytest-cov>=2.0 commands = pytest --cov=my_module tests/ [testenv:flake8] deps = flake8 commands = flake8 src/ [testenv:mypy] deps = mypy commands = mypy src/

14.3 发布检查清单

  1. 代码质量检查

    • 通过所有单元测试
    • 静态类型检查通过
    • 代码风格符合规范
  2. 文档更新

    • 更新CHANGELOG.md
    • 确保所有新API都有文档
    • 示例代码测试通过
  3. 版本号更新

    • 遵循语义化版本控制
    • 更新pyproject.toml中的版本号
  4. 标签与发布

    git tag v1.2.0 git push origin v1.2.0

15. 模块监控与指标

15.1 性能指标收集

# metrics.py import time from dataclasses import dataclass from typing import Dict, List, Optional @dataclass class OperationMetrics: name: str call_count: int = 0 total_time: float = 0.0 error_count: int = 0 class ModuleMetrics: def __init__(self): self._metrics: Dict[str, OperationMetrics] = {} def track(self, name: str): """跟踪操作执行的装饰器""" if name not in self._metrics: self._metrics[name] = OperationMetrics(name) def decorator(func): def wrapper(*args, **kwargs): start = time.perf_counter() self._metrics[name].call_count += 1 try: result = func(*args, **kwargs) except Exception: self._metrics[name].error_count += 1 raise finally: self._metrics[name].total_time += time.perf_counter() - start return result return wrapper return decorator def get_metrics(self, name: Optional[str] = None) -> List[OperationMetrics]: """获取指标数据""" if name: return [self._metrics[name]] if name in self._metrics else [] return list(self._metrics.values())

15.2 日志分析与监控

集成Prometheus监控:

# monitoring.py from prometheus_client import start_http_server, Counter, Histogram REQUEST_COUNT = Counter( 'module_request_total', 'Total request count', ['operation'] ) REQUEST_LATENCY = Histogram( 'module_request_latency_seconds', 'Request latency in seconds', ['operation'] ) def monitor_requests(op_name): """监控请求的装饰器""" def decorator(func): def wrapper(*args, **kwargs): REQUEST_COUNT.labels(op_name).inc() start = time.time() try: result = func(*args, **kwargs) finally: REQUEST_LATENCY.labels(op_name).observe(time.time() - start) return result return wrapper return decorator

15.3 健康检查端点

# health.py import threading from typing import Dict, Any class HealthMonitor: def __init__(self): self._checks: Dict[str, callable] = {} self._status: Dict[str, Any] = {} self._lock = threading.Lock() def add_check(self, name: str, check_func: callable): """添加健康检查项""" with self._lock: self._checks[name] = check_func def run_checks(self) -> Dict[str, Any]: """执行所有健康
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/15 20:36:29

SpringBoot+Vue前后端分离评奖评优管理系统开发实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/15 20:36:15

从零搭建AI个人知识库:ima实战教程

今年我干了一件一直想做但拖了很久的事情&#xff1a;把散落在微信收藏、浏览器书签、本地 PDF、印象笔记里的各种资料&#xff0c;全部归拢到一个地方&#xff0c;再让 AI 替我管。整理完那一刻最大的感受是&#xff0c;以前不是我不爱整理&#xff0c;是工具不合适。这次我用…

作者头像 李华
网站建设 2026/9/15 20:34:36

FrankenPHP 性能调优完全指南:线程池、Worker 模式与生产级配置

FrankenPHP 性能调优完全指南&#xff1a;线程池、Worker 模式与生产级配置 【免费下载链接】frankenphp &#x1f9df; The modern PHP app server 项目地址: https://gitcode.com/GitHub_Trending/fr/frankenphp FrankenPHP 开箱即用的默认配置旨在平衡性能与易用性&a…

作者头像 李华
网站建设 2026/9/15 20:33:57

Astryx 布局原语家族契约:Stack、Grid、Center 与共享空间词汇表

Astryx 布局原语家族契约&#xff1a;Stack、Grid、Center 与共享空间词汇表 【免费下载链接】astryx An open source design system thats fully customizable and agent ready 项目地址: https://gitcode.com/GitHub_Trending/as/astryx 导读 布局原语&#xff08;la…

作者头像 李华
网站建设 2026/9/15 20:33:37

AI智能博客系统开发:全栈架构与核心技术解析

1. 项目概述&#xff1a;AI智能博客开发全景图在内容创作领域&#xff0c;AI技术正从辅助工具升级为核心生产力。这个全栈项目将带你构建一个能自动生成、优化并交互的智能博客系统&#xff0c;涵盖从前端展示到AI集成的完整技术链。不同于传统博客开发&#xff0c;我们需要解决…

作者头像 李华