# Console 与后台服务

HostBuilder 与 WebHostBuilder 共享配置、DI 和生命周期实现。use_startup 接收带 configure_services / configure 方法的对象或无参类。

import asyncio
from yuanboot import BackgroundService, HostBuilder


class Worker(BackgroundService):
    async def execute(self):
        try:
            while True:
                await asyncio.sleep(5)
        finally:
            pass  # 释放任务内部资源


host = (
    HostBuilder()
    .configure_services(lambda services: services.add_hosted_service(Worker))
    .on_application_life_event(
        lambda life: life.subscribe("started", lambda event: print(event.topic))
    )
    .build()
)
# host.run()

事件按 starting → started → stopping → stopped 顺序触发,支持同步/异步处理器。HostedService 依次启动、逆序停止;启动失败回滚,单个清理失败仍继续清理其余服务。后台任务异常会记录日志并令 readiness 失败;正常停止取消并等待任务。 多 worker / 多副本会各自运行后台服务;跨实例的唯一执行、调度和分布式锁应由业务协调。

# 创建 Console 项目

yuanbootctl-python new console -n worker --framework-version 0.2.0
cd worker
python -m pip install -e '.[dev]'
yuanbootctl-python run --profile pro

Console 模板在 worker/worker.py 实现后台工作,在 worker/main.py 注册服务。 Console 不启动 HTTP 端口,不能使用 --port / --host / --reload / --workers 等 Web 参数。

Ctrl+C 或 SIGTERM 触发宿主停止,随后取消后台任务并释放资源。 长任务应在 finally 中清理自己持有的资源,不能吞掉取消信号后继续无限运行。

# 在 Web 服务中运行后台任务

microservice 模板已经包含 Web API 和后台 Worker:

yuanbootctl-python new microservice -n inventory --framework-version 0.2.0

也可以在现有 WebHostBuilder 的 configure_services 中调用 add_hosted_service(Worker)。 需要独立扩缩容或避免 Web 多 worker 重复执行时,将任务放入单独的 Console 服务。