Files
chongming-plugins/example/__init__.py
T

69 lines
2.3 KiB
Python
Raw Normal View History

2026-07-21 15:43:39 +08:00
"""
Example Worker 插件 — 演示 @rpc_method + 显式模型绑定用法
本插件展示如何使用 chongming_worker 框架定义 RPC 端点。
核心工作流:
1. 编写 config/workers/example/*.toml 配置文件
2. 执行 uv run gen_models 生成 Pydantic 模型
3. 在 __init__.py 中用 @rpc_method 定义业务函数
4. 显式导入模型并绑定到对应端点(替代 auto_bind_models)
关键约定:
- 模型命名: <Operation><Method>{Request|Response}
(如 AddGetRequest, AddGetResponse 由 gen_models 自动生成)
- 装饰器 subject 中的操作名 → 模型前缀(驼峰)
example.add → Add, example.subtract → Subtract
"""
from pathlib import Path
from chongming_worker import auto_bind_models
from chongming_worker.runtime import create_workers as _create_workers
from .router import *
auto_bind_models("example")
# ============================================================
# 工厂函数 — 供 app lifespan 动态加载
# ============================================================
# 框架通过 __import__ + getattr 获取此函数,
# 然后调用 create_workers(session, config, count, worker_manager=worker_manager)。
# 详见 src/chongming/app/__init__.py 的 lifespan。
2026-08-10 10:16:25 +08:00
# 幂等标记:防止 create_workers 被重复调用时重复初始化数据库等资源
_initialized = False
2026-07-21 15:43:39 +08:00
async def create_workers(session, config, count=1, worker_manager=None):
"""插件入口 — 委托给 chongming_worker 运行时创建 Worker 协程"""
2026-08-10 10:16:25 +08:00
global _initialized
if _initialized:
print("[example] create_workers 重复调用,跳过重复初始化")
return _create_workers(session, config, count, worker_manager)
2026-07-21 15:43:39 +08:00
from .global_var import set_global_var
2026-07-23 17:45:44 +08:00
from chongming_database import Database
2026-08-10 10:16:25 +08:00
2026-07-23 17:45:44 +08:00
db_path = Path(config.get("data_dir", "./data")) / "example.db"
db = Database(db_path)
await db.initialize()
2026-07-21 15:43:39 +08:00
set_global_var("db", db)
2026-08-10 10:16:25 +08:00
_initialized = True
2026-07-21 15:43:39 +08:00
return _create_workers(session, config, count, worker_manager)
2026-08-10 10:16:25 +08:00
2026-07-21 15:43:39 +08:00
async def cleanup(worker_item: str):
2026-08-10 10:16:25 +08:00
global _initialized
from .global_var import db, set_global_var
2026-07-23 17:45:44 +08:00
if db is not None:
await db.dispose()
2026-08-10 10:16:25 +08:00
set_global_var("db", None)
_initialized = False
2026-07-23 17:45:44 +08:00
print(f"{worker_item} 清理完毕")